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.一旦我修好了,一切都很好.我标记了第一个回答是正确的.对不起红鲱鱼,但与你们一起工作确实有所帮助.
您不需要初始化集合以将类序列化为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- 它们根本不会被序列化(除非您更改默认值,我没有).