0

我想很多人一定有和我一样的需求,应该有一个非常简单的解决方案。如果它是一个,请摆脱我的这种错觉。

我没有花很多时间阅读 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,但没有立即发现任何有用的东西,如果不是绝对必要的话,我真的不想了解“合同解析器”或“可扩展数据合同”(在我看来它只是不应该)。

奇怪的是,序列化程序要求我给它我想要序列化的类型,然后它似乎忽略了这一点,而是使用对象的运行时类型。???

4

0 回答 0