2012-02-08 50 views
1

我有一個簡單的數據契約:WCF DataContract - 治療派生類的基類序列

[DataContract] 
public class MyData 
{ 
    [DataMember] 
    public string AwesomeData { get; set; } 
} 

和服務合同:

[ServiceContract] 
public interface IMyDataService 
{ 
    [OperationContract] 
    MyData GetAwesomeData(); 
} 

在服務器端組件,我創建派生類做處理:

public class MyDataWithInnerds: MyData 
{ 
    public MyDataWithInnerds(object intializationStuff) 
    { 
     AwesomeData = Hypermaxulate(initializationStuff); 
    } 
} 

和服務實現:

public class MyDataService: IMyDataService 
{ 
    public MyData GetAwesomeData() 
    { 
    return new MyDataWithInnerds(HupnerRayvakManager.GetInitializationStuff()); 
    } 
} 

MyDataWithInnerds只是純數據協定MyData的功能實現。

是否有沒有裝飾MyData和引用MyDataWithInnerds告訴序列化器將MyDataWithInnerds序列化爲MyData?帶有MyData的程序集也提供給客戶端。我不希望只引用服務器端MyDataWithInnerds。

我不需要將它反序列化爲MyDataWithInnerds。我猜想我需要將MyDataWithInnerds實例克隆到MyData實例,以便它沒有任何與MyDataWithInnerds相關的類型信息,但是不必這樣做並且讓序列化程序知道「我知道這是一個MyDataWithInnerds,但你可以把它當作基地邁德特」

謝謝, 邁克

編輯

我可以到以下添加到我的配置文件上服務器:

<system.runtime.serialization> 
    <dataContractSerializer> 
     <declaredTypes> 
     <add type="MyClientLib.MyData, MyClientLib"> 
      <knownType type="MyServerLib.MyDataWithInnerds, MyServerLib"/> 
     </add> 
     </declaredTypes> 
    </dataContractSerializer> 
    </system.runtime.serialization> 

這使得序列化正常工作。

它只是留下了兩個方面的問題:

  1. 在我的JSON序列化,我結束了包含派生類類型「__type」成員。我可以刪除嗎?
  2. 是否有一種聲明方式在服務器對象(而不是MyData)上執行配置(添加KnownType的)?

Thanks2, 邁克

回答

1

最後,我創建了一個拷貝構造函數對我的基類,而不是返回的派生類(基類),我回到新基地(衍生)。

[DataContract] 
public class MyData 
{ 
    [DataMember] 
    public string AwesomeData { get; set; } 

    public MyData(MyData obj) 
    { 
     AwesomeData = obj.AwesomeData; 
    } 
} 

服務實現就變成了:

public class MyDataService: IMyDataService 
{ 
    public MyData GetAwesomeData() 
    { 
    MyDataWithInnerds data = 
     new MyDataWithInnerds(HupnerRayvakManager.GetInitializationStuff()); 
    return new MyData(data); 
    } 
} 

在它看起來像矯枉過正簡單的例子,但在實際應用中,體面的工作了 - 而無需額外的配置,而不是發光無關序列化數據。

+1

對於一些替代解決方案,請參閱[鏈接](http:// stackoverflow。COM /問題/ 4140920 /如何對序列化-A-派生類型-AS-其基型與 - WCF)。 – Suncat2000 2015-04-01 18:29:58