按类名反序列化字符串

时间:2018-03-14 10:19:35

标签: c# reflection deserialization

我们说我有一个从类中反序列化的值。

public class MyValue
{
    public string MyPropertyA { get; set; }
    public string MyPropertyB { get; set; }
    public string DeserializationClass { get; } = typeof(MyValue).Name;
}

我使用JsonConvert类对其进行序列化。 MyValue类有一个属性DeserializationClass,应该用作从中序列化字符串的类的信息。换句话说,当我将字符串反序列化为对象时,此属性用作信息,该类应该用于反序列化字符串。但是,我有点卡在这里,因为我不知道如何从字符串中取回类。有人可以帮我吗?

public class Program
{
    void Main()
    {
        var serialized = Serialize();
        var obj = Deserialize(serialized);
    }

    string Serialize()
    {
        var objValue = new MyValue { MyPropertyA="Something", MyPropertyB="SomethingElse" };
        return JsonConvert.SerializeObject<MyClass>(value);
    }

    object Deserialize(string serialized)
    {            
        //How to deserialize based on 'DeserializationClass' property in serialized string?
        return = JsonConvert.Deserialize<???>(serialized);
    }
}

编辑:修改了一些示例,以便更清楚我需要什么,因为当我需要反序列化字符串时,我无法访问objValue。

2 个答案:

答案 0 :(得分:1)

可能您可能需要使用JsonSerializerSettings。 您可能需要做的是

 JsonSerializerSettings setting = new JsonSerializerSettings
            {
                TypeNameHandling = TypeNameHandling.All,
            };

然后在序列化时使用此设置。

 var serialized = JsonConvert.SerializeObject(objValue,setting);

这会给你这样的Json

{"$type":"WPFDatagrid.MyValue, WPFDatagrid","MyPropertyA":"Something","MyPropertyB":"SomethingElse","DeserializationClass":"MyValue"}

从中您可以找到用于实际获取类型的类的名称。

希望这会有所帮助!!

答案 1 :(得分:0)

有一个重载

如果您的Type采用命名空间的形式,则可以从字符串表示中获取类型:

Type objValueType = Type.GetType("Namespace.MyValue, MyAssembly");
object deserialized = JsonConvert.Deserialize(objValueType, serialized);