加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

.net – 使用DataContractJsonSerializer将字典序列化为JSON

发布时间:2020-12-16 19:49:15 所属栏目:百科 来源:网络整理
导读:我有一个对象树,我使用DataContractJsonSerializer序列化到JSON.字典 TKey,TValue被序列化,但我不喜欢标记 – 项目不是这样渲染: {key1:value,key2:value2} 而是像序列化的KeyValuePair TKey,TValue的阵列.对象: [{ "__type":"KeyValuePairOfstringanyType
我有一个对象树,我使用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>序列化器仍然被调用.可能会发生什么,我失踪了?

更新:
我到目前为止的答案和意见几乎只是建议解决方法.但是我注意到,我有一个解决方法工作得很好,所以提出这个问题我有两个目标:

>最终使它与原始设计一起工作 – 我不会改变序列化逻辑,所以有很多代码和逻辑取决于它
>要解读为什么DataContractJsonSerializer不使用我的序列化代码的神秘 – 如可以在我引用的博客文章中看到的,我已经进行了各种实验和界面实现和继承,我相信我正在把握所有这个过程的内在和外在,所以我不明白在这种情况下会发生什么

一个选项是使用代理属性,并将字典放在自定义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);
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读