我有一个简单的数据 Contract :
[DataContract]
public class MyData
{
[DataMember]
public string AwesomeData { get; set; }
}
和服务 Contract :
[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只是纯数据 Contract MyData的功能实现 .
反正有没有装饰MyData并引用MyDataWithInnerds来告诉序列化器将MyDataWithInnerds序列化为MyData?具有MyData的程序集也会提供给客户端 . 我不希望只引用服务器端的MyDataWithInnerds .
我不需要将其反序列化为MyDataWithInnerds . 我猜我需要将MyDataWithInnerds实例克隆到MyData实例,因此它没有与MyDataWithInnerds相关联的任何类型信息,但是不必这样做并且让序列化器知道它真的很有效“我知道这是一个MyDataWithInnerds,但你可以像对待MyData那样对待它”
谢谢,迈克
EDIT
我能够将以下内容添加到服务器上的配置文件中:
<system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
<add type="MyClientLib.MyData, MyClientLib">
<knownType type="MyServerLib.MyDataWithInnerds, MyServerLib"/>
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>
这使序列化正常工作 .
它只留下两个侧面问题:
-
在我的JSON序列化中,我最终得到了一个包含派生类类型的"__type"成员 . 我可以删除吗?
-
在服务器对象(不是MyData)上是否有声明性的方法,我在配置中做了什么(添加了KnownType)?
谢谢,迈克
1 回答
最后,我为我的基类创建了一个复制构造函数,而不是返回派生类(作为基类),我返回新的基(派生) .
然后,服务实现变为:
在简单的例子中,它看起来有点过分,但在实际的应用程序中,它运行得很好 - 没有额外的配置,也没有发出无关的序列化数据 .