我有一份简单的数据合同:
[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,但你可以像对待MyData那样对待它”
谢谢, 迈克
修改
我能够将以下内容添加到服务器上的配置文件中:
<system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
<add type="MyClientLib.MyData, MyClientLib">
<knownType type="MyServerLib.MyDataWithInnerds, MyServerLib"/>
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>
这使序列化工作正常。
它只留下两个侧面问题:
Thanks2, 麦克
答案 0 :(得分:1)
最后,我为我的基类创建了一个复制构造函数,而不是返回派生类(作为基类),我返回新的base(派生)。
[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);
}
}
在简单的例子中,它看起来有点过分,但在实际的应用程序中,它运行得很好 - 没有额外的配置,也没有发出无关的序列化数据。