C# Jsonet更喜欢IEnumerable而不是ISerializable

C# Jsonet更喜欢IEnumerable而不是ISerializable,c#,serialization,json.net,C#,Serialization,Json.net,我有一个类,它是一个字符串的包装器,提供了一些额外的功能。在其他接口中,它还实现了IEnumerable接口 我希望能够使用JsonNet将其序列化为字符串。因为它不工作并且总是序列化到数组中-我想是因为IEnumerable接口,我添加了ISerializable接口。但由于某些原因,JsonNet仍然创建一个数组并忽略ISerializable。添加SerializableAttribute也没有帮助 下面是一个小的概念验证代码,演示了该行为(对于LINQPad): void Main()

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

我希望能够使用JsonNet将其序列化为字符串。因为它不工作并且总是序列化到数组中-我想是因为
IEnumerable
接口,我添加了
ISerializable
接口。但由于某些原因,JsonNet仍然创建一个数组并忽略
ISerializable
。添加
SerializableAttribute
也没有帮助

下面是一个小的概念验证代码,演示了该行为(对于LINQPad):

void Main()
{
JsonConvert.SerializeObject(新的NotACollection(“foo”)).Dump();//[“f”、“o”、“o”]
}
[可序列化]
类集合:IEnumerable,ISerializable
{
私有只读字符串_值;
公证人集合(字符串值)
{
_价值=价值;
}
公共IEnumerator GetEnumerator()
{
返回_value.GetEnumerator();
}   
IEnumerator IEnumerable.GetEnumerator()
{
返回GetEnumerator();
}
public void GetObjectData(SerializationInfo信息、StreamingContext上下文)
{
信息添加值(“\u值”,\u值);
}
公共重写字符串ToString()
{
返回_值;
}
}
我知道我可以创建一个定制的
jsonvert
类,但是由于包装器位于一个库中,我不想引用JsonNet,所以我更喜欢另一个解决方案

我做错什么了吗?我以为JsonNet会选择
ISerializable
实现,如果它可用的话


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

如果为要序列化的类添加
[JsonObject(MemberSerialization.Fields)]
属性,则它应该将类字段序列化为Json{u值”:“foo”}

[JsonObject(MemberSerialization.Fields)]
内部类集合:IEnumerable,ISerializable

BinaryFormatter
使用
Serializable
属性和
ISerializable
接口。它们对json.net毫无意义。@AlexanderPetrov mhmm。。。但看起来应该是这样的,请参见——实现ISerializable的类型被序列化为JSON对象。序列化时,仅使用从ISerializable.GetObjectData返回的值;类型上的成员将被忽略。反序列化时,调用带有SerializationInfo和StreamingContext的构造函数,传递JSON对象的值HMM,我错了。在JSON.NET的下一版本中,您应该能够使用数据协定属性覆盖
IEnumerable
属性。看看最近实现了哪些注释。哦,我认为这是重复的:。相关github问题:。好的,那么看来我毕竟需要一个json.net引用。@t3chb0t您很可能需要。我也遇到了同样的问题,最终得到了相同的解决方案来强制序列化成员。
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;
    }
}
    [JsonObject(MemberSerialization.Fields)]
    internal class NotACollection : IEnumerable<char>, ISerializable