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结合使用:建议的解决方案无法使用,因为源代码无法更改(将此视为事实),正如问题中所述。