我通常将结构设为只读。但是,序列化库(例如DataContractSerializer
)期望序列化的字段或属性能够被读取/写入。
所以我相信我的选择是:
在这种情况下,人们通常会做什么?
答案 0 :(得分:1)
DataContractSerializer可以序列化只读字段
var serializer = new DataContractSerializer(
typeof(ToSerialize),
new DataContractSerializerSettings()
{
SerializeReadOnlyTypes = true
});
但是,如果您要反序列化具有仅具有getter的属性的类,则此方法仅适用于单向工作。因此,您可以序列化而不是反序列化这样的内容:
[DataContract]
public struct ToSerialize
{
public ToSerialize(string a)
{
PropertyToSerialize = "a";
}
[DataMember]
public string PropertyToSerialize { get; }
}
因此,您可以将私有集添加到属性中,或者添加背景字段并用[DataMember]属性对其进行标记。
[DataContract]
public struct ToSerialize
{
public ToSerialize(string a)
{
backingField = "a";
}
public string PropertyToSerialize => backingField;
[DataMember]
string backingField;
}
通过使用专用设置器,您很难更改对象的状态(您可以使用反射来完成)。因此,如果没有方法可以更改结构中的字段,并且所有属性都具有私有设置程序,则该结构在技术上是不可变的。在您的情况下,我会去找一个私人的二传手,比起反思,它更易读,并且花费的精力更少。