{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的自定义对象中包装通用Dictionary来避免这种情况,我在GetObjectData方法中实现了我的自定义序列化(只需要3行).
现在的问题 – 我不能让我的类派生自Dictionary< TKey,TValue>,所以我实现了我的自定义类中的所有逻辑(添加,清除等),被应用于私有字典< 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不使用我的序列化代码的神秘 – 如可以在我引用的博客文章中看到的,我已经进行了各种实验和界面实现和继承,我相信我正在把握所有这个过程的内在和外在,所以我不明白在这种情况下会发生什么
public Dictionary<string,string> NodeData { get; set; } [DataMember(Name="NodeData")] private CustomDictionarySerializer NodeDataSurrogate { get { return new CustomDictionarySerializer(NodeData); } set { NodeData = value._data; } } [Serializable] private class CustomDictionarySerializer : ISerializable { public Dictionary<string,string> _data; public CustomDictionarySerializer(Dictionary<string,string> dict) { _data = dict; } public CustomDictionarySerializer(SerializationInfo info,StreamingContext context) { _data = new Dictionary<string,string>(); var valueEnum = info.GetEnumerator(); while(valueEnum.MoveNext()) { _data[valueEnum.Current.Name] = valueEnum.Current.Value.ToString(); } } public void GetObjectData(SerializationInfo info,StreamingContext context) { foreach (var pair in _data) { info.AddValue(pair.Key,pair.Value); } } }