2014-06-17 3 views
1

추상 클래스를 사용하여 WCF 용 DataContract로 정의하고 싶습니다. 다음 예제에서는 내 추상 클래스 UpperClass을 정의하는 방법을 보여줍니다.WCF : 추상 클래스를 DataContract로 사용하는 방법

[DataContract(IsReference = true)] 
[KnownType(typeof(SubClass1))] 
[KnownType(typeof(SubClass2))] 
abstract public class UpperClass 
{ 
    abstract public void update(); 
} 

SubClass1UpperClass에서 SubClass2 상속합니다. 실제로 이들은 내부적으로 만 사용되는 update()이라는 하나의 메서드 만 공유합니다 (DataMember 아님). 다음 코드 SubClass1SubClass2 구현 보여준다

서버 측
[DataContract] 
public class SubClass1 : UpperClass 
{ 
    private int[] _val1; 
    private int[] _val2; 

    //internal constructor: 
    public SubClass1() 
    { 
     _val1 = new int[2]; 
     _val2 = new int[2]; 

     //initialize values of _val1 and _val2 ... 
    } 

    //internal update method 
    public override void update() 
    { 
     //here comes update formulas... 
    } 

    //enable simple access from WCF client: 
    [DataMember] 
    public int[] val1 
    { 
     get { return _val1; } 
     set { _val1 = value; } 
    } 

    [DataMember] 
    public int[] val2 
    { 
     get { return _val2; } 
     set { _val2 = value; } 
    } 
} 





[DataContract] 
public class SubClass2 : UpperClass 
{ 
    private int[] _value1; 
    private int[] _value2; 

    //internal constructor: 
    public SubClass2() 
    { 
     _value1 = new int[12]; 
     _value2 = new int[12]; 
    } 

    // ... 

, 난의 [OperationContract가 (참 IsInitiating = IsTerminating = 거짓)]으로 정의 된 다음의 코드를 사용하여 내 survice를 공급 그 인터페이스 클래스.

UpperClass DatSet = proxy.init("SubClass1"); 

나는이 줄의 끝으로 디버깅, DatSet의 내용은 매우 이상한 같습니다 :

public UpperClass init(string s) 
{ 
    if (s.Equals("SubClass1")) 
     obj = new SubClass1(); 
    else if (s.Equals("SubClass2")) 
     obj = new SubClass2(); 

    return obj; 
} 

그리고 클라이언트 측에서

, 내 서비스를 사용하여 소비 (또는 초기화)

{} MyExternalLayer.IMyProcessingLayer_proxy.SubClass1 [MyExternalLayer.IMyProcessingLayer_proxy.SubClass1] {} MyExternalLayer.IMyProcessingLayer_proxy.SubClass1 ExtensionData : {System.Runtime.Serialization.ExtensionDataObject} extensionDataField : {System.Runtime.Serialization.ExtensionDataObject} 하여 PropertyChanged : 나는 WCF 서비스로 데이터 계약을 붙여 그들은 내가하지만, 잘 작동

+0

예외 메시지는 무엇이라고 말합니까? – nvoigt

+0

어쨌든 나는 예외를 없앴습니다. 미안하지만, 이유는 모르겠다. 그러나, 제 변수'DatSet'은 매우 이상한 내용을 가지고 있습니다. 'SubClass1'에 대한 deserialization이 예상대로 작동하지 않는 것 같습니다. – Boozzz

+0

그것은 나에게 상당히 정상적인 것처럼 보입니다. 어쩌면 당신이 예상 한 것을 설명 할 수 있을까요? – nvoigt

답변

0

널 (null) 데이터 컨트랙트 및 초월 서비스 경계에서 비즈니스 로직 (abstract public void update();)을 사용하지 않는 것이 좋습니다. 하지만 그것은 단지 의견 일뿐입니다.

관련 문제