繁体   English   中英

序列化C#不可变结构的最佳实践是什么?

[英]What is the best practice for serializing C# immutable structs?

我通常将结构设为只读。 但是,序列化库(例如DataContractSerializer )期望序列化的字段或属性是可读写的。

所以我相信我的选择是:

  • 使我的字段可写只是为了安抚序列化器
  • 创建代理对象以进行序列化
  • 使用反射自动生成代理
  • 通过尝试使用试探法或属性来猜测适当的构造函数,来自动生成序列化/反序列化函数。

人们在这种情况下通常会做什么?

如果像这样初始化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;
}

通过使用专用设置器,您很难更改对象的状态(您可以使用反射来完成)。 因此,如果没有方法可以更改结构中的字段,并且所有属性都具有私有设置程序,则该结构在技术上是不可变的。 在您的情况下,我会去找一个私人的二传手,比起反思,它更易读,并且花费的精力更少。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM