2014-01-27 2 views
0

Microsoft ASP.NET Web API를 사용하여 솔루션을 구축하고 싶습니다. 나는 'IDisplayInfo'인터페이스를 구현하는 'Person'과 같은 복잡한 객체를 가질 수 있기를 원합니다. 사람 직렬화 할 때 모든 속성을 정상적으로 serialize 할 싶습니다 있지만 WorkOrder 개체 같은 인터페이스를 지정하는 다른 개체를 serialize 할 때 인터페이스 직렬화 할 속성을 싶습니다. 나는 XML과 JSON 모두와 함께 작업하고 싶다. DefaultContractResolver를 재정의하려고 시도했지만 어떻게 작동하는지 이해하는 데 문제가 있습니다.WebAPI - 복잡한 클래스에서 인터페이스를 직렬화하지만 여전히 구체적인 클래스를 직렬화 할 수 있습니다.

도움 주셔서 감사합니다.

public interface IDisplayInfo 
{ 
    string Id { get; } 
    string Display { get; } 

} 

public class Person : IDisplayInfo 
{ 
    public string Id { get; set; } 
    public string Display { get { return FirstName + " " + LastName; } } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class WorkOrder 
{ 
    public string Title { get; set; } 
    public IDisplayInfo CreatedBy { get; set; } 
} 

직렬화 WorkOrder은 다음과 같아야합니다 {제목 : "테스트", CreatedBy : {ID : "1"표시 "밥 폭스"}}

직렬화 된 사람은 다음과 같아야를 : {ID : "1"표시 "밥 폭스", 이름 : "밥"성 "여우"}

+0

나는 내 대답의 맨 위에 재미있을만한 링크를 추가했습니다. 당신이 필요한 것을 얻을 수 있는지보십시오. – pid

답변

0

사용할 수있는 특성이있다 :

NotSerialized

이것은 직렬화 기가 해당 특성을 스킵하도록 지시합니다.


당신은 그렇게 할 수 없습니다. 직렬화는 인터페이스와 같은 추상화가 아닌 구체적인 데이터를 기반으로합니다. 여기

봐 : Why can XmlSerializer serialize abstract classes but not interfaces?

또는이 : 말했다 XmlSerialization with Interfaces

이 솔루션은 특별한 별도의 유형이 될 수는 생성자 복용을 가지고 (이 시점에서 그것은뿐만 아니라 구조체 수 있습니다) 클래스에 복사하고 값을 복사하십시오. 그런 다음이를 직렬화 할 수 있습니다.

분명히 PersonConcretized 구조체가 이에 따라 작동해야합니다.

비 직렬화는 또 다른 이야기가 될 것입니다 ...