【发布时间】:2017-03-26 10:34:59
【问题描述】:
在得知我无法序列化类中的私有属性后,我开始使用 DataContract 和 DataMember 注释。
我的类中有一个私有字符串属性,我想将其序列化为属性而不是元素。
[DataContract]
public class Channel
{
private string m_Name = string.Empty;
private DateTime? m_TxTime = null;
[DataMember, XmlAttribute("name")]
public string Name
{
get
{
return m_Name;
}
set
{
m_Name = value;
}
}
public DateTime? TxTime
{
get
{
return m_TxTime;
}
set
{
m_TxTime = value;
}
}
[DataMember, XmlAttribute("txTime")]
private string txTimeForSerialization
{
get
{
if (TxTime.HasValue)
{
return TxTime.Value.ToString("o");
}
else
{
return null;
}
}
}
}
尝试同时使用 DataMember 和 XmlAttribute 注释给了我这个输出:
<channel name="NAME">
<TxTime>2017-03-26T13:15:56.8042989+03:00</TxTime>
</channel>
我想要的结果是这样的-
<channel name="NAME" txTime="2017-03-26T13:15:56.8042989+03:00" />
我序列化的方式是使用 XmlSerializer -
using (FileStream fs = new FileStream("channels.txt", FileMode.Create))
{
XmlSerializer serializer = new XmlSerializer(typeof(Channel));
serializer.Serialize(fs, objectName);
}
【问题讨论】:
-
XmlSerializer仅序列化公共字段和属性。另外,如果你想使用它,你不需要DataContract和DataMember属性,因为它们被DataContractSerializer使用。 -
DataContractSerializer不使用 XML 属性。见How can you control .NET DataContract serialization so it uses XML attributes instead of elements?。如下所示实现IXmlSerializable应该适用于两个序列化程序。
标签: c# serialization datacontract datamember