使用Protobuf-Net,我發現似乎不可能在沒有無參數構造函數的情況下反序列化一個類,或者我可能會錯過某些東西?有沒有無參數構造函數的類可以使用Protobuf-Net?
我不想要一些具有無參數構造函數的類。是否有某種屬性可以使用或使用其他技術?
使用Protobuf-Net,我發現似乎不可能在沒有無參數構造函數的情況下反序列化一個類,或者我可能會錯過某些東西?有沒有無參數構造函數的類可以使用Protobuf-Net?
我不想要一些具有無參數構造函數的類。是否有某種屬性可以使用或使用其他技術?
protobuf-net目前依賴於具有無參數構造函數的工作。
但是這個構造函數不需要是公共的(it will use reflection if need be to invoke it),所以你可以定義所需的私有構造函數以供protobuf-net使用(添加一個關於爲什麼的註釋)並處理那裏的特定序列化相關問題。
這使得您的api的其餘部分無法構建「非法」實例。
Marc指出,如果你在談論最外層的消息對象,你也可以自己創建對象並調用Serializer.Merge。但是如果它需要創建一個對象(因爲它目前有一個空實例,或者對於列表/數組中的新項目),那麼它會查找默認的構造函數。
ShuggyCoUk使用無參數構造函數是正確的。
儘管如此 - 如果您正在討論最外層的消息對象,您也可以自己創建對象並致電Serializer.Merge
。但是如果它需要創建一個對象(因爲它當前有一個null
實例,或者對於列表/數組中的新項目),那麼它會查找默認構造函數。
我想,我還可以提供的一些屬性標記說「只是通過FormatterServices
創建一個原始對象」,但這種感覺不必要的(帶私人蔘數的構造函數相比),並且可能無法在所有平臺上工作(Silverlight,CF等 - 可能存在問題)。
我猜這是你已經做了什麼('FormatterServices')與SkipConstructor選項,這些天可用? – DeCaf 2016-04-15 07:47:25
@DeCaf是的,就是這樣 – 2016-04-15 12:04:54
何時調用無參數構造函數?其他字段更新之前? – mcmillab 2014-11-17 08:16:59