如何序列化一个包含自定义对象列表的类?

4

我有两个类:

namespace Something
{
    [Serializable]
    public class Spec
    {
        public string Name { get; set; }

        [XmlArray]
        public List<Value> Values { get; set; }
    }

    [Serializable]
    public class Value
    {
        public string Name { get; set; }

        public short StartPosition { get; set; }

        public short EndPosition { get; set; }

        public Value(string name, short startPosition, short endPosition)
        {
            Name = name;
            StartPosition = startPosition;
            EndPosition = endPosition;
        }
    }
}

当我尝试序列化时
var spec = new Spec();
spec.Name = "test";
spec.Values = new List<Value> { new Value("testing", 0, 2) };

var xmls = new XmlSerializer(spec.GetType());    
xmls.Serialize(Console.Out, spec);

我遇到了一个错误:

InvalidOperationException

反射类型“Something.Spec”时出现错误。

使用字符串列表没有任何问题。我是否缺少某些属性?


2
尝试查看您收到的异常,注意它说“请参阅内部异常以获取更多详细信息”,而内部异常则表示:“……无法序列化值,因为它没有无参数构造函数”。 - Lasse V. Karlsen
2个回答

7

如果你想将 Value 类序列化,那么它需要拥有一个默认构造函数。例如:

public class Value
{
    public string Name { get; set; }
    public short StartPosition { get; set; }
    public short EndPosition { get; set; }
}

请注意,对于XML序列化,您不需要使用[Serializable]属性,它完全被XmlSerializer类忽略。


事实上,他收到的异常的InnerException提到了这个特定的事实,即没有无参数构造函数。 - Lasse V. Karlsen
@Lasse 我完全忘记检查内部异常了,谢谢。我正在这里进行测试,默认构造函数需要存在,但它没有用于任何事情。所以我让它抛出一个异常,我需要设置值,"默认值"是无效的。 - BrunoLM
感谢您清晰的回答并告诉我关于XML序列化不需要Serializable属性的事情。其实我之前并不知道。 :P - BrunoLM
@Bruno:反序列化时将使用无参数构造函数。 - Lasse V. Karlsen

0

可能是因为您的Value类型没有可用于在反序列化时创建实例的构造函数吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接