我想很多人一定有和我一样的需求,应该有一个非常简单的解决方案。如果它是一个,请摆脱我的这种错觉。
我没有花很多时间阅读 DataContractSerializer,我希望我真的不需要……这是在 WCF 代码优先的上下文中,我不太关心在线上的 XML。
基本上,我有一个包含多个组件的面向服务的解决方案。我想在内部(在我的服务之间)公开一些东西,但不向外部调用者公开。
起初我以为我可以做这样的事情:
[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”始终是 MyEntityInternal 的一个实例(如果重要,则声明为对象)。然后我尝试序列化(obj)和序列化(obj)。
如前所述,当我包含 KnownType 属性时,这确实“有效”(即不会崩溃!)。但是,即使我将对象“作为外部”序列化,“何时”也会被序列化。
我确实意识到我可以将这两种类型创建为不相关的(都从对象继承)并编写一个映射器,但这似乎是对开发工作和周期的巨大浪费。当然必须有一些简单的解决方案来解决这个问题??
如果您知道讨论此或密切相关问题的好资源,请给我指点。我快速浏览了 MSDN,但没有立即发现任何有用的东西,如果不是绝对必要的话,我真的不想了解“合同解析器”或“可扩展数据合同”(在我看来它只是不应该)。
奇怪的是,序列化程序要求我给它我想要序列化的类型,然后它似乎忽略了这一点,而是使用对象的运行时类型。???