2015-07-20 54 views
1

我需要序列化它的源代码无法更改的类(以此作为事实),它来自不同的程序集。它只有一个构造函数Json.NET - 如何使用内部构造函数序列化外部类?

public class MyObject 
    { 
     string _s; 
     int _i; 
     internal MyObject(string s, int i) 
     { 
      // ... 
     } 
    } 

JsonConvert.SerializeObject(object)失败当然是因为这个原因。我想知道是否有一种方法可以使用Json.NET来序列化这个类,而不必添加代码甚至标签。

+1

什么是你当它失败的错误消息?我想问的原因是,如果DeserializeObject与构造函数有关,就不应该抛出异常,因为这是当它需要再次构造对象的时候。 –

+0

“MyObject”类是否密封?你能继承吗? –

+0

@MarioStoilov它不密封。 –

回答

3

如果你有参数构造函数,你应该能够通过将下面的设置要做到这一点:

如果没有:

问题编辑后
JsonSerializerSettings settings = new JsonSerializerSettings() 
{ 
    ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor 
}; 

var serializedJson = JsonConvert.DeserializeObject<MyObject>(jsonString, settings); 

更新任何public构造函数,你没有无参数的构造函数,那么我只知道2个选项:

  1. [JsonConstructor]属性添加到您的internal构造函数中(因为您无法编辑该类,所以在您的案例中似乎没有选项)。
  2. 创建一个具有相似属性的代理类(不像优雅但不需要改变类)。
+0

嗨,请阅读我编辑的文章 –

+0

建议的解决方案不能使用,因为*源代码不能改变(以此为事实)*,正如问题中所述。 –

1

你可以使用一个代理类具有类似性质:

public sealed class TargetClass{ 
    public static readonly TargetClass tc = new TargetClass(); 
    public int Id; 
    public string SomeName; 
    private TargetClass(){ 
     this.Id=50; 
     this.SomeName="My, What Bastardry"; 
    } 
} 
public class ProxyClass{ 
    public int Id {get; set;} 
    public string SomeName {get; set;} 
    public ProxyClass(){ 
    } 
    public ProxyClass(int id, string somename){ 
     Id = id; 
     SomeName = somename; 
    } 
} 
public class Program 
{ 
    public static void Main() 
    { 
     TargetClass tgt = TargetClass.tc; 
     ProxyClass pc = new ProxyClass(tgt.Id,tgt.SomeName); 
     string s = JsonConvert.SerializeObject(pc); 
     Console.WriteLine(s); 
    } 
} 
+0

嗨,请阅读我编辑的帖子。 –

+1

使用Reflection和代理对象的快速和肮脏的示例,但您可以将它与其他人提到的自定义JsonConvertors结合使用:https://dotnetfiddle.net/OtOXSm –

2

你应该使用custom JsonConverter

解决办法是像

public class MyObjectProxy 
{ 
    public string s { get; set; } 
    public int i { get; set; } 
} 

public class MyObjectJsonConverter : JsonConverter 
{ 
    public override void WriteJson(
     JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     // Create an instance of MyObjectProxy, copy values from the 
     // instance of MyObject, write JSON from the MyObjectProxy. 
    } 

    public override object ReadJson(
     JsonReader reader, Type type, object value, JsonSerializer serializer) 
    { 
     // Deserialize MyObjectProxy, create an instance of MyObject, 
     // copy properties from the deserialized MyObjectProxy. 
    } 

    public override bool CanConvert(Type type) 
    { 
     return typeof(MyObject).IsAssignableFrom(type); 
    } 
} 
相关问题