.net – 使用DataContractJsonSerializer将字典序列化为JSON
我有一个对象树,我使用DataContractJsonSerializer序列化到JSON.字典< TKey,TValue>被序列化,但我不喜欢标记 – 项目不是这样渲染:
{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>序列化器仍然被调用.可能会发生什么,我失踪了? 更新: >最终使它与原始设计一起工作 – 我不会改变序列化逻辑,所以有很多代码和逻辑取决于它
一个选项是使用代理属性,并将字典放在自定义ISerializable类型中,这样您就不用担心继承:
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); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |