Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net DataContractSerializer和外部/内部实体_.net_Wcf - Fatal编程技术网

.net DataContractSerializer和外部/内部实体

.net DataContractSerializer和外部/内部实体,.net,wcf,.net,Wcf,我想很多人一定和我有同样的需求,应该有一个非常简单的解决方案。如果这是一个错觉,请让我摆脱它 我没有花太多时间阅读DataContractSerializer,希望我真的不需要。。。这是在一个WCF代码优先的上下文中,对于网络上的XML,我不太关心它 基本上,我有一个具有多个组件的面向服务的解决方案。我希望在内部(在我的服务之间)公开一些内容,但不向外部调用方公开 起初我以为我可以做这样的事情: [DataContract] //[KnownType(typeof(MyEntityInterna

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

我没有花太多时间阅读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)
{
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,但没有立即发现任何有用的东西,如果“契约解析程序”或“可扩展数据契约”不是绝对必要的(在我看来也不应该),我真的不想了解它们


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

你试过界面吗?这有用吗?