一旦程序员决定实现IXmlSerializable,实现它的规则和最佳实践是什么?我听说GetSchema()应该返回null,ReadXml应该在返回前移动到下一个元素。这是真的吗?那么关于WriteXml——它应该为对象写一个根元素,还是假设根元素已经被写了?如何处理和写入子对象
这是我现在拥有的一个样本。我会在收到好的回复后更新它
公共类MyCalendar:IXmlSerializable
{
私有字符串\u名称;
启用私有布尔;
私人色彩(u色),;
私有列表<;MyEvent>;_事件=新列表<;MyEvent>;();
公共XmlSchema GetSchema(){return null;}
公共void ReadXml(XmlReader)
{
if(reader.MoveToContent()==XmlNodeType.Element&;reader.LocalName==“MyCalendar”)
{
_名称=读卡器[“名称”];
_enabled=Boolean.Parse(读取器[“enabled”]);
_color=color.FromArgb(Int32.Parse(reader[“color”]);
if(reader.ReadToDescendant(“MyEvent”))
{
while(reader.MoveToContent()==XmlNodeType.Element&;reader.LocalName==“MyEvent”)
{
MyEvent evt=新的MyEvent();
ReadXml(reader);
_添加事件(evt);
}
}
reader.Read();
}
}
public void WriteXml(XmlWriter)
{
WriteAttributeString(“Name”,_Name);
WriteAttributeString(“Enabled”,_Enabled.ToString());
WriteAttributeString(“Color”,_Color.ToArgb().ToString());
foreach(MyEvent evt in_事件)
{
WriteStarteElement(“MyEvent”);
evt.WriteXml(编写器);
writer.writeedelement();
}
}
}
公共类MyEvent:IXmlSerializable
{
私有字符串\u标题;
私人日期时间(u start);;
私人日期时间站;
公共XmlSchema GetSchema(){return null;}
公共void ReadXml(XmlReader)
{
if(reader.MoveToContent()==XmlNodeType.Element&;reader.LocalName==“MyEvent”)
{
_标题=读者[“标题”];
_start=DateTime.FromBinary(Int64.Parse(reader[“start”]);
_stop=DateTime.FromBinary(Int64.Parse(reader[“stop”]);
reader.Read();
}
}
public void WriteXml(XmlWriter)
{
WriteAttributeString(“Title”,_Title);
WriteAttributeString(“Start”,_Start.ToBinary().ToString());
WriteAttributeString(“Stop”,_Stop.ToBinary().ToString());
}
}
对应的示例XML
<;MyCalendar Name=“主计划”Enabled=“True”Color=“-14069085”>;
<;MyEvent Title=“编写代码”Start=“-8589241828854775808”Stop=“-8589241756854775808”/>;
<;MyEvent Title=“??”Start=“-8589241828854775808”Stop=“-8589241756854775808”/>;
<;MyEvent Title=“Profit!”Start=“-858924704885475808”Stop=“-858924697654775808”/>;
</我的日历>;
是,GetSchema()应返回null
IXmlSerializable.GetSchema此方法
方法是保留的,不应
习惯于在实施
IXmlSerializable接口,您应该
返回一个空引用(在
VisualBasic),而不是,
如果无法指定自定义架构
如果需要,请应用
XmlSchemaProviderAttribute到
班级
对于读和写,object元素已经被写入,因此不需要在write中添加外部元素。例如,您可以开始读取/写入这两个属性中的属性
对于写入:
您需要的WriteXml实现
provide应该写出XML
对象的表示。这个
框架编写一个包装器元素并
将XML编写器放置在其
开始您的实现可以编写
它的内容,包括子
元素。然后框架关闭
包装器元素
并阅读:
ReadXml方法必须重新构造
使用以下信息创建对象:
是通过WriteXml方法编写的调用此方法时,读取器
位于
元素,该元素为
你喜欢的类型。也就是说,就在
指示开始的开始标记
序列化对象的。当这
方法返回时,它必须已读取
从开始到结束的整个元素,
包括它的全部内容。不像
WriteXml方法,框架
不处理包装器元素
自动地您的实现
我们必须这样做。没有遵守这些规定
定位规则可能导致代码丢失
生成意外的运行时异常
或损坏数据
我同意这有点不清楚,但可以归结为“你的工作就是Read()wrapper的end元素标记”