.net DataContractSerializer和外部/内部实体
我想很多人一定和我有同样的需求,应该有一个非常简单的解决方案。如果这是一个错觉,请让我摆脱它 我没有花太多时间阅读DataContractSerializer,希望我真的不需要。。。这是在一个WCF代码优先的上下文中,对于网络上的XML,我不太关心它 基本上,我有一个具有多个组件的面向服务的解决方案。我希望在内部(在我的服务之间)公开一些内容,但不向外部调用方公开 起初我以为我可以做这样的事情:.net DataContractSerializer和外部/内部实体,.net,wcf,.net,Wcf,我想很多人一定和我有同样的需求,应该有一个非常简单的解决方案。如果这是一个错觉,请让我摆脱它 我没有花太多时间阅读DataContractSerializer,希望我真的不需要。。。这是在一个WCF代码优先的上下文中,对于网络上的XML,我不太关心它 基本上,我有一个具有多个组件的面向服务的解决方案。我希望在内部(在我的服务之间)公开一些内容,但不向外部调用方公开 起初我以为我可以做这样的事情: [DataContract] //[KnownType(typeof(MyEntityInterna
[DataContract]
//[KnownType(typeof(MyEntityInternal))]
public class MyEntity
{
[DataMember]
public string Toto { get; set; }
[DataMember]
public string Tata { get; set; }
}
[DataContract]
//[KnownType(typeof(MyEntity))]
public class MyEntityInternal : MyEntity
{
[DataMember]
public DateTime When { get; set; }
}
也就是说,我认为我不需要任何“已知类型”或类似的类型来处理正常的继承。其思想是构建所有逻辑,使其仅适用于内部类型。然后,我可以为外部公开的服务创建一个服务外观。对于输出,我只需要声明外部类型
那不行。我收到异常,抱怨意外的类型,以及关于KnownTypes的提示。因此,我尝试添加KnownType属性(您可以取消注释它们),这确实意味着我可以将“内部”序列化为“外部”,但令人烦恼的是,序列化程序总是将所有内容序列化
我试过这个:
string Serialize<T>(object obj)
{
var xs = new DataContractSerializer(typeof(T));
var ms = new MemoryStream();
xs.WriteObject(ms, obj);
ms.Position = 0;
var r = new StreamReader(ms);
return r.ReadToEnd();
}
字符串序列化(对象obj)
{
var xs=新的DataContractSerializer(typeof(T));
var ms=新内存流();
xs.WriteObject(ms,obj);
ms.Position=0;
var r=新的StreamReader(毫秒);
返回r.ReadToEnd();
}
在我的测试中,“obj”始终是MyEntityInternal的一个实例(如果有必要的话,声明为object)。然后我尝试序列化(obj)和序列化(obj)
如前所述,当我包含KnownType属性时,这确实“起作用”(即不会崩溃!)。但是,即使我将对象序列化为“外部”,也会序列化“When”
我确实意识到我可以将这两种类型创建为不相关的(都是从对象继承的)并编写映射器,但这似乎是对开发工作和周期的巨大浪费。这个问题肯定有简单的解决办法
如果你知道有一个很好的资源在讨论这个或密切相关的问题,请给我一个指针。我快速浏览了MSDN,但没有立即发现任何有用的东西,如果“契约解析程序”或“可扩展数据契约”不是绝对必要的(在我看来也不应该),我真的不想了解它们
奇怪的是,序列化程序要求我给它指定我想要序列化的类型,然后它似乎忽略了这一点,而是使用对象的运行时类型 你试过界面吗?这有用吗?