4

我需要序列化一个其源代码不能更改的类(将此作为事实),并且它来自不同的程序集。它只有一个构造函数

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

JsonConvert.SerializeObject(object)因此当然失败了。我想知道是否有一种方法可以使用 Json.NET 来序列化此类,而无需添加代码甚至标记。

4

3 回答 3

8

如果你有一个无参数的构造函数,你应该可以通过添加以下设置来做到这一点:

JsonSerializerSettings settings = new JsonSerializerSettings()
{
    ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor
};

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

问题编辑后更新:

如果您没有任何 public构造函数并且没有无参数构造函数,那么我只知道 2 个选项:

  1. [JsonConstructor]属性添加到您的internal构造函数(在您的情况下这似乎不是一个选项,因为您无法编辑类)。
  2. 创建一个具有相似属性的代理类(不那么优雅,但不需要更改类)。
于 2015-07-20T07:48:52.733 回答
2

您应该使用自定义 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);
    }
}
于 2015-07-20T08:14:03.597 回答
1

You could use a proxy class with similar properties:

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);
    }
}
于 2015-07-20T07:55:58.417 回答