4

ソースコードを変更できないクラスをシリアル化する必要があり(これを事実として)、それは別のアセンブリからのものです。コンストラクターは 1 つしかありません

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

JsonConvert.SerializeObject(object)このため、もちろん失敗します。Json.NET を使用して、コードやタグを追加することなく、このクラスをシリアル化する方法があるのだろうか。

4

3 に答える 3

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

同様のプロパティを持つプロキシ クラスを使用できます。

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 に答える