인터페이스를 구현하는 클래스 유형의 객체를 역 직렬화하는 방법 (JSON) : 오류 매개 변수없는 생성자가 정의되지 않았습니까?

ElHaix

C #, .Net v4.0 사용-다음과 같은 구조가 주어집니다.

public interface IInterface {...}

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

클래스에 매개 변수가없는 생성자가 정의되어 있습니다.

JSON 객체를 받으면 역 직렬화를 시도하고 다음 MyClass과 같은 오류를 수신합니다.

이 객체에 대해 정의 된 매개 변수없는 생성자가 없습니다.

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

나는 또한없이 시도했다 SimpletypeResolver()

나는 내가 찾고있는 것 주위를 맴돌고있는 것처럼 보이는 몇몇 포스트보았다 . 그러나 내가 무언가를 놓치고 있지 않는 한 거기에는 그렇지 않다.

MyClass인터페이스를 구현하므로 인터페이스에 기본 생성자를 정의 할 수 없습니다. 알았다. 그렇다면 MyClass객체를 어떻게 역 직렬화 할 수 있습니까?

Cgotberg

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

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관