2009-06-16 5 views
0

XML 웹 서비스에서 (클래스가 구현되는) 인터페이스를 어떻게 사용합니까?C# xml 웹 서비스에서 인터페이스 사용

이렇게하면 인터페이스가 직렬화되지 않는다고 주장하는 YSOD가 표시됩니다. 인터페이스의 클래스에 Serializable 특성을 추가하면 진행을 방해하는 또 다른 오류가 있습니다 (어떤 것을 기억할 수 없는지).

+0

다른 예외가 도움이 될 수 있습니다. –

+0

어떤 유형의 웹 서비스입니까 ??? REST, SOAP ...? – vidalsasoon

+0

SOAP입니다. 나는 다른 예외 메시지를 얻으려고 노력할 것이다. – dotnetdev

답변

2

대부분의 경우 인터페이스는 약간의 작업없이 직렬화 할 수 없습니다. 일반적으로이 오류는 직렬화되는 클래스에 인터페이스를 변수 또는 일부 변형으로 사용하는 개체가 포함되어있을 때 발생합니다. 이제 당신은 항상 상속 객체에 CustomInterfaceProperty를 할당하는 것을 가정 해 봅시다,

[Serializable] 
public class TestClass 
{ 
    private ICustomInterface _iCustomInterfaceObject; 

    public ICustomInterface CustomInterfaceProperty 
    { 
     get { return _iCustomInterfaceObject; } 
     set { _iCustomInterfaceObject = value; } 
    } 
} 
인수를 위해서

(나를 추가 검증 코드를 입력하게하지 않음) : 예를 들어,이 같은 속성은 오류를 슬로우 ICustomInterface (이와 같은 인터페이스 유형을 사용할 때 필요). 100 % 항상 채워지는 경우에도 TestClass를 직렬화 할 수 없습니다.

이 문제를 해결하려면 사용하고있는 인터페이스, 즉 오류가 발생하는 인터페이스가 ISerializable에서 상속되는지 확인해야합니다. 그렇게하면 ICustomInterface에서 상속 한 모든 개체에도 일련 화 메서드가 구현되어 있다고 약속 할 수 있습니다.

불행히도 xml serialization을 사용할 때는 그렇지 않습니다. System.Xml.Serialization에있는 serializer를 사용하는 경우이 메서드는 작동하지 않습니다. Robert Harvey가 지적했듯이 인터페이스에는 xml serializer를 사용할 때 필요한 매개 변수없는 생성자가 포함되어 있지 않기 때문입니다. 지금 내 제안, 당신이 직렬화의 방법에 설정되어있는 경우, 문제의 섹션에 [XmlIgnore] 속성을 첨부하고 거기에서 계속 이동하십시오.

+0

[XmlIgnore] 속성을 해당 섹션에 연결한다고하면이 인터페이스는 전체 인터페이스가됩니다. 이 올바른지? – dotnetdev

+0

인터페이스가 보통 원인 일 뿐이므로 직렬화 할 속성에 [XmlIgnore]를 적용해야합니다. 예를 들어 위의 예에서 "public ICustomInterface CustomInterfaceProperty"바로 위에 적용 할 것입니다. – Zensar

0

다른 메시지는 기본 (매개 변수없는) 생성자가 없기 때문에 인터페이스를 직렬화 할 수 없다고 생각합니다.

기본 클래스가 프레임 워크 클래스 인 경우 마우스를 사용할 수 있습니다. 그 중 일부는 직렬화 가능으로 표시되지 않고 일부에는 매개 변수없는 생성자가 없습니다.

+0

생성자에서 매개 변수를 사용하는 사용자 정의 클래스를 사용하면 모든 것이 정상적으로 작동합니다. 이러한 클래스는 직렬화 가능으로 표시되지 않았습니다. 사용 된 프레임 워크 클래스 중 일부는 직렬화되지 않을 수도 있습니다. 그래서 내가 사용하는 모든 프레임 워크 클래스는 직렬화가 가능해야합니까? 그러나 비즈니스 클래스에는이 속성이 필요하지 않습니다. – dotnetdev

+0

나는 그것이 문맥에 달려 있다고 생각한다. 나는 자신의 커스텀 클래스를 직렬화하기 위해 리플렉션을 사용하는 헬퍼 메소드를 가지고있다. 그리고 XML 클래스를 XML 네임 스페이스 속성으로 표시 했음에도 불구하고 이들 클래스를 직렬화 가능 클래스로 표시하지 않았다. 프레임 워크 클래스를 직렬화 할 때의 문제점은 다른 클래스에 의존하거나 상속하는 것이 많아서 먹이 사슬 전체에서 작동해야한다는 것입니다. –

2

내 조언은 기본적인 데이터 전송 개체로만 사용할 수 있으며 더 이상 아무것도 처리하지 않는 것이 좋습니다. 도메인 객체를 사용하고 직렬화하기를 원하지만 이미 알고있는 것처럼 일반적인 메모리 내 객체는 많은 작업없이 직렬화 될 수있는 것보다 훨씬 더 복잡 할 수 있습니다.

또한 도메인 클래스의 기능을 제한하여 직렬화가 가능하도록 유지할 수도 있습니다.

마지막으로 피할 수있는 미묘한 버그와 별도의 DTO가있는 이유는 도메인 개체를 공개적으로 게시 된 인터페이스, 즉 웹 서비스 자체와 밀접하게 연결하고 있다는 것입니다. 웹 서비스의 버전 관리는 번거롭기 때문에 서비스 인터페이스가 도메인 클래스와 밀접하게 결합되어 있지 않은 경우 더 쉽습니다.

0

또한 런타임 직렬화와 XML 직렬화간에 혼동을 느낄 수 있습니다. XML Serialization은 오래된 ASMX 웹 서비스가 사용하는 것입니다. [Serializable] 속성에 많은주의를 기울이지는 않지만 대부분 기본 생성자가있는 public 클래스의 공용 읽기/쓰기 속성을 직렬화합니다.

관련 문제