gpt4 book ai didi

.net - 使用 DataContractJsonSerializer 将 Dictionary 序列化为 JSON

转载 作者:行者123 更新时间:2023-12-03 20:55:55 26 4
gpt4 key购买 nike

我有一个使用 DataContractJsonSerializer 序列化为 JSON 的对象树. Dictionary<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"
}]

丑陋,不是吗?

因此,我通过将通用 Dictionary 包装在实现 ISerializable 的自定义对象中来避免这种情况。 ,我在 GetObjectData 中实现了我的自定义序列化方法(它只需要 3 行)。

现在的问题 - 我不能让我的类派生自 Dictionary<TKey, TValue> ,所以我在我的自定义类中实现所有逻辑( AddClear 等),应用于私有(private) Dictionary<TKey, TValue> field 。继承会更可取,因为在使用自定义对象时,我将拥有所有通用的 Dictionary 功能。

继承的问题是 Dictionary<TKey, TValue>实现 ISerializableDataContractJsonSerializer即使我实现 ISerializable 似乎更喜欢这种实现明确地从我的自定义类中,如下所示:
public class MyClass : Dictionary<string, object>, ISerializable
{
public override void GetObjectData(SerializationInfo info,
StreamingContext context)
}

实际上我很惊讶这是可能的,因为它允许我实现相同的接口(interface)两次,而显然无法使用显式接口(interface)实现 - 所以我在博客文章 about multiple interface implementation 中更详细地分析了这种情况

所以,根据我在那里做的实验,序列化程序应该调用我的 ISerializable 实现,无论内部使用什么类型的转换 -
((ISerializable)((Dictionary<,>)obj)).GetObjectData(...)

或者:
((ISerializable)obj).GetObjectData(...)

但它显然没有发生,正如我在结果 JSON 中看到的 KeyValuePair<TKey, TValue>仍在调用序列化程序。我错过了什么可能会发生什么?

更新:
到目前为止,我得到的答案和评论几乎只是建议解决方法。但是,我注意到我有一个非常有效的解决方法,所以在提出这个问题时我有两个目标:
  • 最终让它与原始设计一起工作——我不会仅仅为此改变序列化逻辑,有很多代码和逻辑依赖于它
  • 解开为什么不是 DataContractJsonSerializer 的奥秘使用我的序列化代码 - 正如我提到的博客文章中所见,我已经对接口(interface)实现和继承进行了各种实验,并且我确信我掌握了这个过程的所有细节,所以我因无法理解在这种情况下发生的事情而感到困扰
  • 最佳答案

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

    关于.net - 使用 DataContractJsonSerializer 将 Dictionary<TKey, TValue> 序列化为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7498208/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com