C# 使用自动生成的序列化程序导致数据丢失
我有一个描述小模式的xsd文件。我在xsd.exe的帮助下创建了一个C#文件(我在开发者命令提示符下运行了这个命令:C# 使用自动生成的序列化程序导致数据丢失,c#,xml,serialization,xsd,data-loss,C#,Xml,Serialization,Xsd,Data Loss,我有一个描述小模式的xsd文件。我在xsd.exe的帮助下创建了一个C#文件(我在开发者命令提示符下运行了这个命令:xsd.exe smallSchema.xsd/classes/language:CS),以便能够轻松地(反)序列化它。我获取了一个符合该模式的xml文件,并尝试使用生成的代码对其进行反序列化。但是我注意到数据丢失了 有人能告诉我数据丢失的原因吗? 这是我要反序列化的xml文件: <?xml version="1.0" encoding="UTF-8"?> <to
xsd.exe smallSchema.xsd/classes/language:CS
),以便能够轻松地(反)序列化它。我获取了一个符合该模式的xml文件,并尝试使用生成的代码对其进行反序列化。但是我注意到数据丢失了
有人能告诉我数据丢失的原因吗?
这是我要反序列化的xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<top-element>
<complex-elem type="plain-number">1</complex-elem>
<top-elem-name>myTopElement</top-elem-name>
</top-element>
但被覆盖的文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<top-element>
<complex-elem />
<top-elem-name>myTopElement</top-elem-name>
</top-element>
下面是调用xsd.exe的结果(注释为德语):
//------------------------------------------------------------------------------
//
//Dieser代码wurde von einem工具生成器。
//Laufzeitversion:4.0.30319.42000
//
//ÄUnderungen and dieser Datei können falsches Verhalten verursachen and gehen verloren,wenn
//这是欧内斯特将军的密码。
//
//------------------------------------------------------------------------------
使用System.Xml.Serialization;
//
//Dieser Quellcode wurde Automaticsh generiert von xsd,版本=4.6.1055.0。
//
///
[System.CodeDom.Compiler.GeneratedCodeAttribute(“xsd”,“4.6.1055.0”)]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute(“代码”)]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(“top元素”,Namespace=”“,IsNullable=false)]
公共部分类topelement{
私有complexelem complexelemField;
私有字符串topleNameField;
///
[System.Xml.Serialization.XmlElementAttribute(“复杂元素”)]
公共complexelem complexelem{
得到{
返回此.complexelemField;
}
设置{
this.complexelemField=值;
}
}
///
[System.Xml.Serialization.XmlElementAttribute(“顶级元素名称”)]
公共字符串topleName{
得到{
返回此.toplemnamefield;
}
设置{
this.toplemnamefield=值;
}
}
}
///
[System.CodeDom.Compiler.GeneratedCodeAttribute(“xsd”,“4.6.1055.0”)]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute(“代码”)]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(“复杂元素”,名称空间=”,IsNullable=false)]
公共部分类complexelem{
私有字符串项字段;
///
[System.Xml.Serialization.XmlElementAttribute(“普通编号”)]
公共字符串项{
得到{
返回此.itemField;
}
设置{
this.itemField=值;
}
}
}
您尝试反序列化的XML示例无法根据您提供的XSD模式进行验证
如果尝试验证XML,将出现三个验证错误:
- Cvc复杂类型。3.2.2:属性“type”不允许出现在元素“complex elem”的第“2”行第“39”列中李>
- Cvc复杂类型.2.3:元素“complex elem”不能有字符[子元素],因为该类型的内容类型是Element only.,Line “2”,列“55”李>
- Cvc复杂类型。2.4.b:元素“复杂元素”的内容不完整。应为“{plain number}”中的一个,行“2”,列 “55”
<?xml version="1.0" encoding="UTF-8"?>
<top-element>
<complex-elem>
<plain-number>1</plain-number>
</complex-elem>
<top-elem-name>myTopElement</top-elem-name>
</top-element>
您的XML与XSD架构不匹配。这就是它反序列化错误的原因。
<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="top-element">
<xs:complexType>
<xs:sequence>
<xs:element ref="complex-elem" />
<xs:element ref="top-elem-name" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="complex-elem">
<xs:complexType>
<xs:choice>
<xs:element ref="plain-number" />
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="plain-number" type="xs:string" />
<xs:element name="top-elem-name" type="xs:string" />
</xs:schema>
//------------------------------------------------------------------------------
// <auto-generated>
// Dieser Code wurde von einem Tool generiert.
// Laufzeitversion:4.0.30319.42000
//
// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
// der Code erneut generiert wird.
// </auto-generated>
//------------------------------------------------------------------------------
using System.Xml.Serialization;
//
// Dieser Quellcode wurde automatisch generiert von xsd, Version=4.6.1055.0.
//
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute("top-element", Namespace="", IsNullable=false)]
public partial class topelement {
private complexelem complexelemField;
private string topelemnameField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("complex-elem")]
public complexelem complexelem {
get {
return this.complexelemField;
}
set {
this.complexelemField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("top-elem-name")]
public string topelemname {
get {
return this.topelemnameField;
}
set {
this.topelemnameField = value;
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute("complex-elem", Namespace="", IsNullable=false)]
public partial class complexelem {
private string itemField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("plain-number")]
public string Item {
get {
return this.itemField;
}
set {
this.itemField = value;
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<top-element>
<complex-elem>
<plain-number>1</plain-number>
</complex-elem>
<top-elem-name>myTopElement</top-elem-name>
</top-element>
<xs:element name="complex-elem">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="type" type="xs:string" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>