Dot-Net

使用 protobuf-net 序列化數組時如何處理空值?

  • December 26, 2012

以下語句失敗NullReferenceException

TypeModel.Create().DeepClone(new string[1]);

檢查原始碼會發現異常是故意拋出的,這意味著null數組中的值違反了協議緩衝區規範(有意義,null不是任何值的重複)。

好的,規範是正確的,但是如果集合中仍然存在空值,我們該怎麼辦?除了確保沒有任何null價值進入我們的收藏品之外,是否有解決方案?

謝謝。

這是一個棘手的問題。在網路級別,集合只是一個重複的標籤——每個元素代表一個對象。很簡單,沒有辦法在 protobuf 規範中直接表達 a 。null

現在,我可能會弄髒並為帶有空值的集合使用某種雙重標籤,但是 - 老實說,我認為使用看起來為空的非空對象通常會更好(如果你明白我的意思)。在字元串的情況下,也許 ""會做(這取決於上下文,真的)。

我也願意接受建議,但是……它需要牢記規範的限制。

看到這個:

http://code.google.com/p/protobuf-net/issues/detail?id=217

引用相關部分

項目成員 marc.gravell 的評論 4,2011 年 12 月 14 日

我還沒有記錄該選項(它是作為特定請求添加的),但是 -目前你只能通過(例如)啟用它:

RuntimeTypeModel.Default[typeof (YourType)][3].SupportNull = true;

其中 3 是欄位編號。

這也應該在屬性模型上可用……

請注意使用者“將”——我之前回答的刪除者——我知道這不是最好的地方,但我不知道有其他方式給你發消息,在這種情況下保持安靜是錯誤的:我很抱歉第一次回答“太短”,但是編輯不會比突然刪除更具建設性嗎?我提供的連結仍然沒有回答問題,評論也證明了這一點……我只是偶然發現你確實刪除了它。

引用自:https://stackoverflow.com/questions/7331806