2016-06-30 92 views
4

System.Tuple(T1,..)類別標記爲[SerializableAttribute](見msdn)。但是它們沒有無參數的構造函數,因此它不能被XmlSerializer序列化,因爲它在here之前已被清除。那麼爲什麼不添加一個?爲什麼元組沒有無參數構造函數,而`[Serializable]`?

+3

我不明白爲什麼這是被低估。任何知道序列化應該如何工作的人都是一個相當有趣的問題。 –

+4

誰投票結束,因爲它「主要是基於意見」顯然不明白這個問題。 –

+0

@ThomasLevesque問題是讓人猜測爲什麼這個框架類的設計方式是這樣的。這完全是基於意見的。考慮到你發佈了一個答案,甚至沒有試圖回答被問到的問題,即爲什麼這個類沒有無參數的構造函數,似乎你是不瞭解問題的那個。 – Servy

回答

3

您不需要使用[Serializable]屬性將其序列化爲XmlSerializer,類型具有該屬性的事實並不意味着您可以使用XmlSerializer將其序列化;這兩者是無關的。 [Serializable]僅用於二進制序列化(*)(不需要無參數構造函數)。

概括起來:

  • 二進制序列
    • 需要[Serializable]屬性
    • 不需要公共參數構造函數
  • XML序列化
    • 不需要[Serializable]屬性
    • 需要public參數的構造函數

因此,使用XmlSerializer你不能序列化Tuple<...>


不管上述情況,Tuple<...>可以有一個默認的構造函數,但它沒有多大意義:元組是不可變的(你不能設置其屬性),所以如果你用默認創建的實例構造函數,屬性將始終具有其默認值,無法更改。 (而且,事實上,屬性是隻讀的,也未嘗防止元組被序列化與XmlSerializer,只支持公共讀寫屬性)


(*)其實,不只是二進制序列化,但任何序列化格式(如BinaryFormatter,SoapFormatter ...)

+1

圍繞這個問題的這種裙子。我相信問題的精神在於 - 爲什麼Tuple沒有公共無參數構造函數,因此它可以與XmlSerializer一起使用? – bodangly

+0

@bodangly OP似乎認爲因爲Tuple是'[Serializable]',它應該有一個無參數的構造函數,並且可以用'XmlSerializable'來序列化,這是不正確的 –

+0

@bogdanly我更新了我的答案 –

相關問題