gpt4 book ai didi

c# - 如何反序列化(JSON)实现接口(interface) : error no parameterless constructor defined? 的类类型的对象

转载 作者:太空宇宙 更新时间:2023-11-03 16:05:59 25 4
gpt4 key购买 nike

使用 C#、.Net v4.0 - 给定以下结构:

public interface IInterface {...}

public class MyClass : IInterface
{
public MyClass() {}
.
.
.
}

我确实在类中定义了无参数构造函数。

收到 JSON 对象后,我尝试反序列化 MyClass 并收到如下错误:

no parameterless constructor defined for this object

var serializer = new JavaScriptSerializer(new SimpleTypeResolver());
var newObject = serializer.Deserialize(jsonObject, myClass.GetType());

我也尝试过不使用 SimpletypeResolver()

我看过a few posts似乎徘徊在我正在寻找的东西周围,但不完全在那里 - 除非我遗漏了什么。

MyClass 实现了一个接口(interface),接口(interface)中不能定义默认构造函数。知道了。那么如何反序列化 MyClass 对象呢?

最佳答案

你需要告诉你的反序列化器想要将 json 转换为具体的类类型。一种方法是在 Json.Net 中实现 JsonConverter 类。

完整的设计工作示例。

public interface IMyClass
{
void SetMyVariable(int value);
}

public class MyClass : IMyClass
{

public int MyVariable;

public MyClass()
{
MyVariable = 10;
}

public void SetMyVariable(int value)
{
this.MyVariable = value;
}
}

public class MyParentClass
{
public IMyClass IMyClass { get; set; }
}


public class MyClassConverter : JsonConverter
{
/// <inheritdoc />
public override bool CanWrite
{
get
{
return false;
}
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotSupportedException();
}

/// <inheritdoc />
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader == null)
{
throw new ArgumentNullException("reader");
}

if (serializer == null)
{
throw new ArgumentNullException("serializer");
}

if (reader.TokenType == JsonToken.Null)
{
return null;
}

var jsonObject = JObject.Load(reader);
var value = new MyClass();

if (value == null)
{
throw new JsonSerializationException("No object created.");
}

serializer.Populate(jsonObject.CreateReader(), value);
return value;
}

/// <inheritdoc />
public override bool CanConvert(Type objectType)
{
return typeof(IMyClass).IsAssignableFrom(objectType);
}
}

[TestClass]
public class UnitTest2
{
[TestMethod]
public void TestSerializer()
{
var myClass = new MyParentClass { IMyClass = new MyClass() };
var serializedClass = JsonConvert.SerializeObject(myClass);
var result = JsonConvert.DeserializeObject<MyParentClass>(serializedClass, new MyClassConverter());
Assert.IsNotNull(result);
}
}

关于c# - 如何反序列化(JSON)实现接口(interface) : error no parameterless constructor defined? 的类类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19404858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com