DataContractSerializer - 如何使用 ElementName 而不是 属性 名称来序列化对象?
DataContractSerializer - How to serialize objects using ElementName instead of property name?
我在使用 DataContractSerializer
时遇到序列化问题。我面临的问题是生成的 XML 文件始终具有为 class 和字段定义名称的标签,而不是使用 XmlRoot
或 XmlElement
中设置的名称ElementName
属性。例如对于class定义如下:
[XmlRoot(ElementName = "customer")]
public class Customer
{
[XmlElement(ElementName = "name")]
public string Name { get; set; }
[XmlElement(ElementName = "address")]
public string Address { get; set; }
}
生成的 XML 在我的例子中总是:
<Customer>
<Name>abc</Name>
<Address>xyz</Address>
</Customer>
虽然我想要得到的输出是使用小写 ElementName
的输出:
<customer>
<name>abc</name>
<address>xyz</address>
</customer>
我正在使用扩展方法通过 C# 对象使用以下内容进行序列化:
public static XDocument SerializeToXElement(object o)
{
XDocument doc = new XDocument();
using (var writer = doc.CreateWriter())
{
var serializer = new DataContractSerializer(o.GetType());
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
serializer.WriteObject(writer, o);
}
doc.StripNamespace();
return doc;
}
我还在我的序列化函数中调用了另一个扩展方法,以从我的 XDocument
中剥离命名空间,如下所示:
public static void StripNamespace(this XDocument document)
{
if (document.Root == null) return;
foreach (var element in document.Root.DescendantsAndSelf())
{
element.Name = element.Name.LocalName;
element.ReplaceAttributes(GetAttributesWithoutNamespace(element));
}
}
如何使 DataContractSerializer 使用 ElementName
而不是 class/property 名称?
这应该适合你,
[XmlRoot("customer")]
public class Customer
{
[XmlElement("name")]
public string Name { get; set; }
[XmlElement("address")]
public string Address { get; set; }
}
根据我的评论,您应该 use DataContract and DataMember attributes 而不是 XmlRoot
和 XmlElement
:
[DataContract(Name = "customer", Namespace = "")]
public class Customer
{
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "address")]
public string Address { get; set; }
}
我在使用 DataContractSerializer
时遇到序列化问题。我面临的问题是生成的 XML 文件始终具有为 class 和字段定义名称的标签,而不是使用 XmlRoot
或 XmlElement
中设置的名称ElementName
属性。例如对于class定义如下:
[XmlRoot(ElementName = "customer")]
public class Customer
{
[XmlElement(ElementName = "name")]
public string Name { get; set; }
[XmlElement(ElementName = "address")]
public string Address { get; set; }
}
生成的 XML 在我的例子中总是:
<Customer>
<Name>abc</Name>
<Address>xyz</Address>
</Customer>
虽然我想要得到的输出是使用小写 ElementName
的输出:
<customer>
<name>abc</name>
<address>xyz</address>
</customer>
我正在使用扩展方法通过 C# 对象使用以下内容进行序列化:
public static XDocument SerializeToXElement(object o)
{
XDocument doc = new XDocument();
using (var writer = doc.CreateWriter())
{
var serializer = new DataContractSerializer(o.GetType());
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
serializer.WriteObject(writer, o);
}
doc.StripNamespace();
return doc;
}
我还在我的序列化函数中调用了另一个扩展方法,以从我的 XDocument
中剥离命名空间,如下所示:
public static void StripNamespace(this XDocument document)
{
if (document.Root == null) return;
foreach (var element in document.Root.DescendantsAndSelf())
{
element.Name = element.Name.LocalName;
element.ReplaceAttributes(GetAttributesWithoutNamespace(element));
}
}
如何使 DataContractSerializer 使用 ElementName
而不是 class/property 名称?
这应该适合你,
[XmlRoot("customer")]
public class Customer
{
[XmlElement("name")]
public string Name { get; set; }
[XmlElement("address")]
public string Address { get; set; }
}
根据我的评论,您应该 use DataContract and DataMember attributes 而不是 XmlRoot
和 XmlElement
:
[DataContract(Name = "customer", Namespace = "")]
public class Customer
{
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "address")]
public string Address { get; set; }
}