我在字符串上有一个包装器的类,提供了一些额外的功能。在其他接口中,它还实现了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
实施吗?
(这个类不能实现对字符串的隐式转换,因为这会破坏其目的并导致奇怪的错误)
答案 0 :(得分:2)
如果你为你想要序列化的类添加[JsonObject(MemberSerialization.Fields)]
属性,那么它应该将类字段序列化为Json {&#34; _value&#34; :&#34; foo&#34; }
[JsonObject(MemberSerialization.Fields)]
internal class NotACollection : IEnumerable<char>, ISerializable