JsonNet偏爱IEnumerable而不是ISerializable

时间:2018-02-04 12:55:40

标签: c# serialization json.net

我在字符串上有一个包装器的类,提供了一些额外的功能。在其他接口中,它还实现了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实施吗?

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

1 个答案:

答案 0 :(得分:2)

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

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