programing

DataContract Serializer를 사용하는 "Type not expected" - 하지만 단순한 클래스일 뿐 재미있는 것은 없습니까?

css3 2023. 10. 12. 23:27

DataContract Serializer를 사용하는 "Type not expected" - 하지만 단순한 클래스일 뿐 재미있는 것은 없습니까?

XML-시리얼라이제이션을 리팩토링하고 있는데, DataContract Serializer를 사용해 보겠습니다.이 클래스를 직렬화해야 할 때까지 모든 작업이 원활하게 수행됩니다.

using System;
using System.Runtime.Serialization;

namespace VDB_Sync.Model
{
[DataContract(Name="Konstant")]
public class Konstant : DataFelt
{
    [DataMember]
    private MySqlDbType mydataType;
    [DataMember]
    private object value;

    public Konstant(string navn, MySqlDbType dataType, object value)
        : base(navn, dataType, "*Konstant", false, false)
    {
        //this.navn = navn;
        this.mydataType = dataType;
        this.value = value;

        if (navn.Contains("*Løbenummer"))
        {
            navn = "*Konstant: " + Convert.ToString(value);
        }
    }

    public object Value
    {
        get
        {
            return value;
        }
    }

}
}

내게 이런 말을 해줘요.

'VDB_Sync'를 입력합니다.데이터 계약 이름이 'Konstant:http://schemas.datacontract.org/2004/07/VDB_Sync.Model' '인 Model.Konstant'이(가) 필요하지 않습니다.DataContractResolver를 사용하거나 알려진 유형 목록에 정적으로 알려지지 않은 유형을 추가합니다(예: 알려진 유형 사용).속성 특성을 입력하거나 DataContract Serializer에 전달된 알려진 유형 목록에 추가합니다.

*지금까지 찾은 도움말은 컬렉션과 유형을 가리킵니다.클래스에 열거형(MySqlDbType)이 있지만 다음을 얻습니다.심지어 DataMembers를 전혀 선언하지 않았을 때도 같은 오류가 발생합니다 :-x 그래서 - 여기서 무슨 일이 일어나고 있는 거죠?제가 무엇을 빠뜨리고 있나요?

참고로, VDB_SessionController가 루트인 직렬화 방식입니다.*

    public void GemKonfig(VDB_SessionController session)
    {
        var settings = new XmlWriterSettings()
        {
            Indent = true,
            IndentChars = "\t"
        };

        var writer = XmlWriter.Create(defaultFile, settings);
        DataContractSerializer ser =
            new DataContractSerializer(typeof(VDB_SessionController));

        ser.WriteObject(writer, session);
        writer.Close();
    }

보고되는 예외는 VDB_Sync에 대한 예외입니다.모델. 상수.이는 이 클래스가 체인 어딘가에서 다른 클래스로 당겨지고 해당 클래스가 연재되고 있음을 의미합니다.

문제는 Constant가 이 클래스에 포함된 방법(예: 컬렉션 또는 일반 목록에 있는 경우)에 따라 DataContract Serializer가 역직렬화 중에 표시될 준비가 되지 않을 수 있다는 것입니다.

이를 해결하려면 콘스탄트가 포함된 클래스에 알려진 유형의 속성을 적용해야 합니다.당신의 시리얼라이제이션 코드로 볼 때, 이것은VDB_SessionController.

따라서 이 클래스를 알려진 것으로 장식해 보십시오.유형 특성:

[KnownType(typeof(VDB_Sync.Model.Konstant)]
public class VDB_SessionController

이 내용을 WebApiConfig.cs 에 추가합니다.

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

var json = config.Formatters.JsonFormatter;

json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);

참조 : http://www.datazx.cn/Forums/en-US/a5adf07b-e622-4a12-872d-40c753417645/action?threadDisplayName=web-api-error-the-objectcontent1-type-failed-to-serialize-the-response-body-for-content&forum=wcf

조합할 수도 있습니다.[KnownType]코드가 미래의 변화에 더 저항력을 갖게 해주는 반사 기능을 제공합니다.

[DataContract]
[KnownType("GetKnownPersonTypes")]
internal class Person
{
    private static IEnumerable<Type> _personTypes;

    private static IEnumerable<Type> GetKnownTypes()
    {
        if (_personTypes == null)
            _personTypes = Assembly.GetExecutingAssembly()
                                    .GetTypes()
                                    .Where(t => typeof (Person).IsAssignableFrom(t))
                                    .ToList();
        return _personTypes;
    }
}

이제 a.DataContractSerializer/DataContractJsonSerializer/XmlSerializer함께 작업하도록 구성된Person, 또한 다음에서 파생된 모든 유형과 함께 작동할 것입니다.Person(동일한 어셈블리 내에서 선언되는 한).

알려진 것 사용DataFelt 클래스를 확인하기 위한 Attribute를 입력합니다.참조: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.knowntypeattribute.aspx

문제는 WebAPI 컨트롤러에서 인터페이스(Individual)를 반환하는 것이었습니다.해당 반환 유형을 클래스(개인) 유형으로 변경하자 이 오류가 사라졌습니다.

작동하지 않음:

    [HttpGet]
    [Route("api/v1/Individual/Get/{id}")]
    public IIndividual Get([FromUri]int id)
    {
        return _individualService.Get(id);
    }

작업:

    [HttpGet]
    [Route("api/v1/Individual/Get/{id}")]
    public Individual Get([FromUri]int id)
    {
        IIndividual individual = _individualService.Get(id);
        return individual as Individual;
    }

그것은 @Leon이 제안한 것과 같지만 @Bryan의 수정으로 '알려진'.TypeAttribute'는 기본 클래스에 있어야 하므로 다음과 같습니다.

[DataContract(Name="DataFelt")]
[KnownType(typeof(somenamespace.Konstant))]
public class DataFelt

하위 클래스에서 다음을 선택할 수 있습니다.

[DataContract(Name="Konstant")]
public class Konstant : DataFelt

변경 내용:

[DataContract(Name="Konstant")]
public class Konstant : DataFelt

다음 항목에 대해:

[DataContract(Name="Konstant")]
[KnownTypes(typeof(somenamespace.DataFelt))]
public class Konstant : DataFelt

언급URL : https://stackoverflow.com/questions/8794594/type-not-expected-using-datacontractserializer-but-its-just-a-simple-class