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
'programing' 카테고리의 다른 글
malloc failure는 어떻게 감지합니까? (0) | 2023.10.12 |
---|---|
Angularjs: ocLazy로드 대 Requirejs (0) | 2023.10.12 |
트랙터에서 약속 만들기 및 해결하기 (0) | 2023.10.12 |
angularjs - ngRepeat with ngInit - ngRepeat는 렌더링된 값을 새로 고치지 않습니다. (0) | 2023.10.12 |
해당 루프의 함수 내에서 루프를 탈출하는 것 (0) | 2023.10.12 |