对于我们的软件我要改变我们项目的xml序列化。
几个小时后我发现,如果实现接口private void OnChecked(object sender, RoutedEventArgs e)
{
bool? isChecked = this.toggleButton.IsChecked;
toggleButton.IsChecked = null;
toggleButton.IsChecked = isChecked;
}
,可以修改xml序列化。
在阅读了有关如何正确实现此接口的一些内容后,我已将其实现到实体中。
实现此接口的实体是子类。父类将序列化为xml。如果子类只是一个普通的属性,序列化是正确的,就像一个魅力。 但是,如果父类具有此子类的列表,则序列化将结束为无限循环。
这是一个非常简单的例子来说明我的问题:
IXmlSerializable
这是我用于序列化的logik
public class ParentEntity
{
public List<ChildEntity> Childs { get; set; } = new List<ChildEntity>();
}
public class ChildEntity: IXmlSerializable
{
public string Name { get; set; }
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
Name = reader.GetAttribute("Name");
}
public void WriteXml(XmlWriter writer)
{
writer.WriteAttributeString("Name", Name);
}
}
对象 using (var memoryStream = new MemoryStream())
{
var serializer = new XmlSerializer(typeof(ParentEntity));
serializer.Serialize(memoryStream, parentEntity);
memoryStream.Position = 0;
var deserializedParentEntity = serializer.Deserialize(memoryStream) as ParentEntity;
Console.Read();
}
已正确初始化。
然后我将对象序列化为xml。
在此之后,我将xml反序列化为一个对象(仅用于展示)。
这是我的问题。方法parentEntity
经常被调用。它看起来像一个无限循环。我从未达到反序列化过程的结束。
有谁知道我的问题是什么?
答案 0 :(得分:2)
正如Proper way to implement IXmlSerializable中所述,方法ReadXml()
负责阅读整个元素,包括<ChildEntity>
开始和结束节点,而WriteXml()
不应该这样做,因为包装元素是由框架本身编写的。如果ReadXml()
没有使读者超过初始元素,那么您将获得您所看到的无限循环。
因此,您的ChildEntity
类型应如下所示:
public class ChildEntity : IXmlSerializable
{
public string Name { get; set; }
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
Name = reader.GetAttribute("Name");
reader.Skip(); // Consume the <ChildEntity> and </ChildEntity> (if present) nodes and everything contained therein.
}
public void WriteXml(XmlWriter writer)
{
writer.WriteAttributeString("Name", Name);
}
}
示例fiddle。