.NET XML序列化和空集合

Rod*_*ley 5 .net c# collections serialization xml-serialization

我有一个包含一些集合的类,我想将这个类的实例序列化为XML,而不必将集合初始化为空,而不必实现IXmlSerializable.我不在乎它是否创建空元素,或者根本不创建元素.只需它可以工作而无需为每个基于集合的属性初始化集合.

我已经查看了可以用它来装饰属性的所有XML属性,并且没有取得任何成功.这似乎是一个简单的事情,可以有一个元素或根本没有.然后,当它被反序列化时,它会将它们留空或忽略它们的周期.

以下是用于解决此问题的类的简单版本.使用此和默认值会导致异常"对象引用未设置为对象的实例",因为集合为空;

public class MyClass
{
    public string Name { get; set; }
    public bool IsAlive { get; set; }
    public List<Car> Cars { get; set; }
    public List<Home> Homes { get; set; }
    public List<Pet> Pets { get; set; }

    public void ToXmlFile(string fileName)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
        TextWriter writer = new StreamWriter(fileName);
        serializer.Serialize(writer, this);
        writer.Close();
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑 感谢帮助人员,事实证明问题出在我的GetHashCode方法中,该方法没有正确处理null.一旦我修好了,一切都很好.我标记了第一个回答是正确的.对不起红鲱鱼,但与你们一起工作确实有所帮助.

Aar*_*ght 5

您不需要初始化集合以将类序列化为XML.这是一个简单的程序来演示:

class Program
{
    static void Main(string[] args)
    {
        MyClass c = new MyClass() { Name = "Test", IsAlive = true };
        XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
        using (MemoryStream ms = new MemoryStream())
        {
            serializer.Serialize(ms, c);
            Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
        }
        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

这将打印以下输出:

<?xml version="1.0"?>
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>Test</Name>
  <IsAlive>true</IsAlive>
</MyClass>
Run Code Online (Sandbox Code Playgroud)

换句话说,null集合属性的行为与任何其他属性的行为相同null- 它们根本不会被序列化(除非您更改默认值,我没有).