我有一個對象樹,我序列化爲JSON與DataContractJsonSerializer
。 Dictionary<TKey, TValue>
被序列化,但我不喜歡的標記 - 該項目不呈現:序列化字典<TKey,TValue>與JSON與DataContractJsonSerializer
{key1:value, key2:value2}
而是像系列化KeyValuePair<TKey, TValue>
對象的數組:
[{
"__type":"KeyValuePairOfstringanyType:#System.Collections.Generic",
"key":"key1",
"value":"value1"
},
{
"__type":"KeyValuePairOfstringanyType:#System.Collections.Generic",
"key":"key2",
"value":"value2"
}]
醜,是不是?
因此,我通過將通用字典包裝在實現ISerializable
的自定義對象中,並在GetObjectData
方法中實現我的自定義序列化(僅需3行),從而避免了這種情況。
現在的問題 - 我不能讓我的類從Dictionary<TKey, TValue>
派生,所以我實現所有的邏輯(Add
,Clear
等),在我的自定義類,被應用到私人Dictionary<TKey, TValue>
場。繼承將是可取的,因爲在使用我的自定義對象時,我將擁有所有通用字典功能。
與繼承的問題是,Dictionary<TKey, TValue>
實現自身ISerializable
,並DataContractJsonSerializer
似乎更喜歡這個實現,即使我從我的自定義類實現ISerializable
明確,像這樣:
public class MyClass : Dictionary<string, object>, ISerializable
{
public override void GetObjectData(SerializationInfo info,
StreamingContext context)
}
實際上,我是驚訝,這是可能的,因爲它允許我實施相同的界面兩次而不明顯能夠使用明確的界面實現 - 所以我在博客文章中更詳細地分析了情況about multiple interface implementation
因此,根據我那裏做實驗,序列化應該是叫我實現了ISerializable的,無論是在內部使用什麼類型的鑄造 -
((ISerializable)((Dictionary<,>)obj)).GetObjectData(...)
或:
((ISerializable)obj).GetObjectData(...)
,但它顯然是不正如我在生成的JSON中看到的那樣,KeyValuePair<TKey, TValue>
串行器仍然被調用。我錯過了什麼?
更新: 我所得到的答案和評論幾乎只提供瞭解決方法。然而,我注意到,我有跟提出這個問題,工作得非常好這樣一個解決辦法我有兩個目標:
最終使其與原創設計作品 - 我不會改變序列化邏輯爲此,有很多代碼和邏輯依賴於它
爲了不使用我的序列化代碼爲什麼不是
DataContractJsonSerializer
的謎團 - 我可以在我提到的博客文章中看到,我已經提出各種各樣的接口實現和繼承實驗,我確信我掌握了這個過程的所有細節,所以我很難理解這個過程中發生了什麼。 case
看起來你可以用IEnumerable類和你的ISerializable實現包裝字典。比嘗試從字典繼承更少的工作。 –
您也可以使用'JavaScriptSerializer',因爲它會按照您的喜好序列化字典。 –
@RitchMelton - 從字典繼承並不是很多工作,但我必須承認,實現IEnumerable並一看就返回成員字典的getEnumarator似乎比我的解決方法更好 - 只有一種方法實現 – Vroomfundel