我有一个对象树,我序列化为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