我尝试从ISerializable实现GetObjectData,但我无法使其工作 - 它总是将CData序列化为对象。
类:
public class CData : IXmlSerializable, ISerializable
{
private string m_value;
//...
public override string ToString()
{
return m_value;
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("", m_value);
}
}
public class MyClass
{
public CData CData { get; set; }
}
代码:
MyClass myClass = new MyClass { CData = "asd"};
string o = JsonConvert.SerializeObject(myClass); // returns {"CData":{"":"asd"}}, but want it to be {"CData":"asd"}
更新 我正在寻找解决方案,我可以避免更改 MyClass ,因为我有数百个CData用法,这看起来更像是一个黑客而不是正确的解决方案。
自定义转换器看起来像是要走的路,但是在处理具有CData属性的类时,您必须记住使用此自定义转换器。我希望应该有一个更简单,更好的方法(例如我试图在info.AddValue中设置空字符串("",m_value)或者可能有另一个接口)
答案 0 :(得分:1)
您可以查看为您的类型构建自定义转换器:http://www.newtonsoft.com/json/help/html/CustomJsonConverter.htm
编辑:我不知道任何其他界面,并且它看起来不像ISerializable。然而,JsonConvert可以变得非常灵活。例如:
class conv : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue(((CData)value).Etc);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new Exception(); // didn't bother
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(CData);
}
}
class Wrap
{
public CData Test { get; set; }
}
class CData
{
public string Etc { get; set; }
}
然后只是
JsonConvert.SerializeObject(t3, Formatting.Indented, new conv());
如果你想要以相同的方式处理许多类型,只需使CanConvert和WriteJson中的逻辑更复杂,甚至可以使用反射。