如果您像这样初始化DataContractSerializer,它可以序列化只读字段
var serializer = new DataContractSerializer(
typeof(ToSerialize),
new DataContractSerializerSettings()
{
SerializeReadOnlyTypes = true
});
[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;
}
通过使用私有setter,您很难更改对象的状态(您可能可以使用反射进行更改)。因此,如果没有方法更改结构中的字段,并且所有属性都有私有setter,那么结构在技术上是不可变的。在你的情况下,我会选择一个私人二传,它比使用反射更具可读性,花费更少的精力。