簡體   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