gpt4 book ai didi

C# - 将私有(private)属性序列化为属性(数据协定)

转载 作者:行者123 更新时间:2023-11-30 18:17:40 26 4
gpt4 key购买 nike

在了解到我无法在类中序列化私有(private)属性后,我开始使用 DataContractDataMember 注释。

我的类中有一个私有(private)字符串属性,我想将其序列化为属性而不是元素。

[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;
}
}
}
}

尝试同时使用 DataMemberXmlAttribute 注释给了我这个输出:

<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);
}

最佳答案

为您的类创建“包装器”,它将负责正确的反序列化格式(某种外观模式)

[DataContract]
public class ChannelData
{
[DataMember, XmlAttribute("name")]
public string Name { get; set; }

[DataMember, XmlAttribute("txTime")]
public string txTimeForSerialization { get; set; }
}

您可以将创建序列化实例的逻辑放在 Channel 类中,然后序列化逻辑的责任将保留在 Channel 类中 - 保持封装。

public class Channel
{
public string Name { get; set; }
public DateTime? TxTime { get; set; }

public Channel()
{
Name = string.Empty;
TxtTime = null;
}

public ChannelData ToSerialization()
{
var data = new ChannelData();
data.Name = Name;
data.txTimeForSerialization = TxTime.HasValue ? TxTime.Value.ToString("o") : null;
}
}

使用包装器,您无需为不同的格式考虑不同的“解决方法”,您的“业务层”类将保持“清晰”,包装器将处理格式。

关于C# - 将私有(private)属性序列化为属性(数据协定),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43027637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com