Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Json.NET-如何使用内部构造函数序列化外部类?_C#_Oop_Serialization_Json.net_Private Constructor - Fatal编程技术网

C# Json.NET-如何使用内部构造函数序列化外部类?

C# Json.NET-如何使用内部构造函数序列化外部类?,c#,oop,serialization,json.net,private-constructor,C#,Oop,Serialization,Json.net,Private Constructor,我需要序列化一个类,它的源代码不能更改(这是事实),并且它来自不同的程序集。它只有一个构造函数 public class MyObject { string _s; int _i; internal MyObject(string s, int i) { // ... } } JsonConvert.SerializeObject(object)当然会因此失败。我想知道是否有一种方法可以使用Json.NET序列化这个类,而不必向其中添加代

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

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

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

如果您有一个无参数构造函数,您应该可以通过添加以下设置来实现这一点:

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

var serializedJson = JsonConvert.DeserializeObject<MyObject>(jsonString, settings);
JsonSerializerSettings设置=新建JsonSerializerSettings()
{
ConstructorHandling=ConstructorHandling.AllowNonPublicDefaultConstructor
};
var serializedJson=JsonConvert.DeserializeObject(jsonString,设置);
问题编辑后更新:

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

  • [jsonstructor]
    属性添加到
    内部
    构造函数中(在您的情况下,这似乎不是一个选项,因为您无法编辑该类)
  • 创建一个具有类似属性的代理类(虽然不是很优雅,但不需要更改类)

  • 您可以使用具有类似属性的代理类:

    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);
        }
    }
    
    你应该使用一个

    解决办法是这样的

    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);
        }
    }
    

    当它失败时,您收到的错误消息是什么?我问的原因是,如果
    反序列化对象
    与构造函数相关,那么它不应该抛出异常,因为此时它必须再次构造对象。
    MyObject
    类是否已密封?你能继承它吗?@Mariostilov它不是密封的。你可以尝试继承这个类,并在新的类中定义一个无参数构造函数class@MarioStoilov你不能在C#中这样做。构造函数是内部的。使用反射和代理对象的快速脏示例,但您可以将其与其他人提到的自定义JsonConvertors结合使用:建议的解决方案无法使用,因为源代码无法更改(将此视为事实),正如问题中所述。