我想很多人必须和我一样有需要,应该有一个非常简单的解决方案。如果它是一个错误,请把我除去。
我没有花太多时间阅读有关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属性(你可以取消注释它们),这确实意味着我可以将“internal as serial”序列化,但是烦人的是序列化器然后总是序列化所有内容。
我试过了:
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的一个实例(如果重要,则声明为对象)。然后我尝试Serialize(obj)和Serialize(obj)。
如上所述,当我包含KnownType属性时,这确实“工作”(即不会崩溃!)。但是,即使我将对象“作为外部”序列化,“When”也会被序列化。
我确实意识到我可以创建两种不相关的类型(都是从对象继承)并编写一个映射器,但这似乎是对开发工作和周期的巨大浪费。当然必须有一些简单的解决方案吗?
如果你知道讨论这个或密切相关的问题的好资源,请给我一个指针。我已经快速查看了MSDN,但没有立即找到任何有用的东西,我真的不想了解“合同解析器”或“可扩展数据合同”,如果它不是绝对必要的(并且我的想法)它不应该是。)
奇怪的是,序列化程序要求我为它提供我要序列化的类型,然后它似乎忽略了这一点,而是使用对象的运行时类型。 ???