2009-06-12 3 views
1

웹 서비스 호출에서 추상 클래스를 매개 변수로 사용하고 있습니다. 현재, 그래서 같은 기본 클래스에서 파생 된 클래스의 XmlInclude을 포함하고있다 :웹 서비스 - 기본 클래스 대신 파생 클래스의 XmlInclude?

[XmlInclude(typeof(DerivedClass))] 
public abstract class BaseClass 
{ 
} 

는 그러나, 나는 오히려 기본 클래스에서 파생 된 형식을 모두 포함되지 것입니다. http://www.pluralsight.com/community/blogs/craig/archive/2004/07/08/1580.aspx에서

은, 저자가 대안을 언급 - 대신 웹 방식 위의 속성을 쓰는과 같이 그러나

[WebMethod] 
[System.Xml.Serialization.XmlInclude(typeof(DerivedClass))] 
public BaseClass getClass() { 
    return new DerivedClass(); 
} 

, 또한 어느 웹 서비스에서 파생 된 형식을 넣지 싶습니다 . 파생 된 형식에서 특성을 유지하는 방법이 있습니까?

답변

4

프레임 워크가 비 직렬화가 발생할 때 어떤 형식이 하이라이팅 형식인지와 XML에서 이러한 형식이 어떻게 나타나는지를 알 필요가 있다는 점을 고려하면됩니다. 이 정보가 파생 된 형식으로 저장되는 경우 실제로이 정보를 유추 할 수있는 방법이 없습니다. XmlInclude 속성 를 사용 - - XmlSerializer를 생성자에 허용 된 유형의 집합을 지정하면에 전달하는 서브 클래스를 기대한다면, 지금

과부하 :

당신은 다음 몇 가지 옵션이있다 webservice, 웹 서버 직렬화 및 deserialization을 제어합니다. 따라서 XmlSerializer 컨스트럭터는 더 이상 옵션이 아닙니다.

당신이 말했듯이 클래스에 직접 대신 webservice 메서드에 특성을 넣을 수 있습니다. 수업을 "순수하게"유지하고 필요할 때마다 이러한 속성을 기억하는 것 사이에는 절충점이 있습니다.

물론 실제 문제는 웹 서비스 계층에서 메시지 형식으로 비즈니스 개체를 사용하려고하는 것입니다.

"메시지 형식"과 "비즈니스 객체"책임을 별도로 유지하려는 경우 웹 서비스 매개 변수로만 사용할 다른 클래스 (전체 계층 구조)를 가져야합니다. 이 경우 기본 클래스에서 필요한 모든 XmlInclude 특성을 유지하는 데 아무런 문제가 없습니다. 그런 다음 웹 서비스를 호출 할 때 비즈니스 객체를 메시지 형식 객체로 또는 그로부터 적응 시키십시오. 이것은 매개 변수 유형에 웹 서비스 유형 제약 조건을 적용하지 않는 추가 이점을 제공합니다 (예 : 매개 변수로 인터페이스 없음).

물론이 방법은 편리하지 않습니다.

결국 웹 서비스는 예상되는 유형을 알아야하거나 제대로 직렬화 및 비 직렬화 할 수 없습니다.

그렇습니다. 대답은 '아니오'인 이유에 대한 설명입니다. 파생 된 유형의 속성 만 유지할 수 없습니다. 내가 비록 잘못되고 싶지만 :)

2

이 경우 어떻게 표시되지 않습니까? deserialize하는 경우 파생 된 형식을 전달하는 추가 형식 배열을 지정하기위한 오버로드가 있습니다.

관련 문제