【问题标题】:JsonNet favors IEnumerable over ISerializable [duplicate]JsonNet 偏爱 IEnumerable 而不是 ISerializable [重复]
【发布时间】:2018-02-04 12:55:39
【问题描述】:

我有一个类,它是一个提供一些附加功能的字符串的包装器。在其他接口中,它还实现了IEnumerable<char> 接口。

我希望能够使用 JsonNet 将其序列化为字符串。因为它不起作用并且总是序列化成一个数组——我猜是因为IEnumerable<char> 接口,所以我添加了ISerializable 接口。但出于某种原因,JsonNet 仍然会创建一个数组并忽略 ISerializable。添加SerializableAttribute 也无济于事。

这是一个演示行为的小型概念验证代码(用于 LINQPad):

void Main()
{
    JsonConvert.SerializeObject(new NotACollection("foo")).Dump(); // ["f","o","o"]
}

[Serializable]
class NotACollection : IEnumerable<char>, ISerializable
{
    private readonly string _value;

    public NotACollection(string value)
    {
        _value = value;
    }

    public IEnumerator<char> GetEnumerator()
    {
        return _value.GetEnumerator();
    }   

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("_value", _value);
    }

    public override string ToString()
    {
        return _value;
    }
}

我知道我可以创建一个自定义的 JsonCovert 类,但由于包装器位于我不想引用 JsonNet 的库中,我更喜欢另一种解决方案。

我在这里做错了吗?我认为 JsonNet 会选择 ISerializable 实现(如果可用)?

(这个类不能实现到字符串的隐式转换,因为这会破坏它的目的并导致奇怪的错误)

【问题讨论】:

标签: c# serialization json.net


【解决方案1】:

如果您为要序列化的类添加[JsonObject(MemberSerialization.Fields)] 属性,那么它应该将类字段序列化为 Json {"_value" : "foo" }

    [JsonObject(MemberSerialization.Fields)]
    internal class NotACollection : IEnumerable<char>, ISerializable

【讨论】:

  • 好的,看来我毕竟需要一个 json.net 参考。
  • @t3chb0t 你很有可能会。我遇到了同样的问题,最终得到了相同的解决方案来强制序列化成员。
猜你喜欢
  • 2011-12-13
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 2016-10-30
  • 1970-01-01
  • 2011-11-24
  • 2014-10-07
  • 1970-01-01
相关资源
最近更新 更多