【发布时间】: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 实现(如果可用)?
(这个类不能实现到字符串的隐式转换,因为这会破坏它的目的并导致奇怪的错误)
【问题讨论】:
-
只有
BinaryFormatter使用Serializable属性和ISerializable接口。它们对 json.net 毫无意义。 -
@AlexanderPetrov mhmm... 但它看起来应该,请参阅ISerializable - 实现 ISerializable 的类型被序列化为 JSON 对象。序列化时,仅使用从 ISerializable.GetObjectData 返回的值;类型上的成员被忽略。反序列化时,调用带有 SerializationInfo 和 StreamingContext 的构造函数,传递 JSON 对象的值
-
嗯,我错了。
-
在 Json.NET 的下一个版本中,您应该能够使用数据协定属性来覆盖
IEnumerable属性。请参阅Deserializing anIEnumerable<T>with[DataContract]applied does not work,其中指出它最近已实施。
标签: c# serialization json.net