【问题标题】:What is the best practice for serializing C# immutable structs?序列化 C# 不可变结构的最佳实践是什么?
【发布时间】:2019-01-06 22:36:17
【问题描述】:

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

所以我认为我的选择是:

  • 让我的字段可写只是为了安抚序列化程序
  • 为序列化目的创建代理对象
  • 使用反射自动生成代理
  • 通过尝试猜测一个自动生成序列化/反序列化函数 使用启发式或属性的适当构造函数。

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

【问题讨论】:

标签: c# serialization attributes readonly


【解决方案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;
}

通过使用私有设置器,您很难更改对象的状态(您可能可以使用反射来做到这一点)。因此,如果没有方法更改结构中的字段并且所有属性都有私有设置器,那么您的结构在技术上是不可变的。在你的情况下,我会选择一个私人二传手,它比使用反射更易读并且花费更少的精力。

【讨论】:

    猜你喜欢
    • 2019-11-15
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多