如何使序列化对象看起来与其原始源 xml 文件相同?
How do I get a serialized object to look the same as it's original source xml file?
我有一个由外部公司定义的 xsd 文件,我将其与 xsd.exe 一起使用以生成 类。我可以使用提供的 xml 文件使用生成的 类 反序列化为对象,但在某些情况下我需要将 xml 的较小部分作为 XDocument .直到 运行 时间我才知道这些部分的路径,所以我将 xml 用于:
XElement element = xml.XPathSelectElement(path);
我遇到的问题是序列化结果与传入的 xml 不完全匹配,这使得 select return 为空。如何让序列化对象看起来像传入文件?我可能用 xsd.exe 错误地生成了 类 吗?我最终需要使用相同的生成代码来生成我自己的 xml 文件。
这是我目前用来序列化的代码
var xml = new XDocument();
using (var writer = xml.CreateWriter())
{
List<Type> known = new List<Type>();
known.Add(typeof(ObjType1));
...
var serializer = new DataContractSerializer(typeof(Detail), known);
serializer.WriteObject(writer, sourceDetailObj);
}
序列化结果:
<Detail xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/CustomNameSpace">
...
<numberField>1</numberField>
<detailTypeField>
<objField i:type="ObjType1">
<valObjField i:nil="true" />
...
</objField>
</detailTypeField>
...
</Detail>
它应该是什么样子:
<Detail>
...
<Number>1</Number>
<DetailType>
<ObjType1>
...
</ObjType1>
</DetailType>
...
</Detail>
这是 类 xsd 生成的其中一个:
public partial class DetailType {
private object objField;
[System.Xml.Serialization.XmlElementAttribute("ObjType1", typeof(ObjType1))]
...
public object Obj {
get {
return this.objField;
}
set {
this.objField = value;
}
}
}
Obj 可以是几个 类.
之一
使用 DataContractSerializer
的问题在于它针对在 WCF 服务之间发送消息进行了优化,不一定会产生与 [=11= 相同的 "classic" xml ] 确实如此。
特别是,XmlSerializer
将序列化所有 public 成员,除非您告诉它不要序列化,但对于 DataContractSerializer
除非您告诉它,否则它不会序列化。这样做是为了帮助 WCF 更快;你只会得到你所要求的。
因此,如果您不为 WCF 服务生成 XML,我建议您改用 XmlSerialiser
。
我有一个由外部公司定义的 xsd 文件,我将其与 xsd.exe 一起使用以生成 类。我可以使用提供的 xml 文件使用生成的 类 反序列化为对象,但在某些情况下我需要将 xml 的较小部分作为 XDocument .直到 运行 时间我才知道这些部分的路径,所以我将 xml 用于:
XElement element = xml.XPathSelectElement(path);
我遇到的问题是序列化结果与传入的 xml 不完全匹配,这使得 select return 为空。如何让序列化对象看起来像传入文件?我可能用 xsd.exe 错误地生成了 类 吗?我最终需要使用相同的生成代码来生成我自己的 xml 文件。
这是我目前用来序列化的代码
var xml = new XDocument();
using (var writer = xml.CreateWriter())
{
List<Type> known = new List<Type>();
known.Add(typeof(ObjType1));
...
var serializer = new DataContractSerializer(typeof(Detail), known);
serializer.WriteObject(writer, sourceDetailObj);
}
序列化结果:
<Detail xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/CustomNameSpace">
...
<numberField>1</numberField>
<detailTypeField>
<objField i:type="ObjType1">
<valObjField i:nil="true" />
...
</objField>
</detailTypeField>
...
</Detail>
它应该是什么样子:
<Detail>
...
<Number>1</Number>
<DetailType>
<ObjType1>
...
</ObjType1>
</DetailType>
...
</Detail>
这是 类 xsd 生成的其中一个:
public partial class DetailType {
private object objField;
[System.Xml.Serialization.XmlElementAttribute("ObjType1", typeof(ObjType1))]
...
public object Obj {
get {
return this.objField;
}
set {
this.objField = value;
}
}
}
Obj 可以是几个 类.
之一使用 DataContractSerializer
的问题在于它针对在 WCF 服务之间发送消息进行了优化,不一定会产生与 [=11= 相同的 "classic" xml ] 确实如此。
特别是,XmlSerializer
将序列化所有 public 成员,除非您告诉它不要序列化,但对于 DataContractSerializer
除非您告诉它,否则它不会序列化。这样做是为了帮助 WCF 更快;你只会得到你所要求的。
因此,如果您不为 WCF 服务生成 XML,我建议您改用 XmlSerialiser
。