现在将我的自定义类类型的属性序列化为字符串?

时间:2017-04-14 10:57:24

标签: c# json serialization json.net

我尝试从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)或者可能有另一个接口)

1 个答案:

答案 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中的逻辑更复杂,甚至可以使用反射。