.net WCF自定义对象序列化

.net WCF自定义对象序列化,.net,wcf,serialization,.net,Wcf,Serialization,我有下面的场景 我的环境是Visual Studio 2010,Framework 4.0 有一个dll我无法控制,其中包含某些(相当复杂的)对象。我需要在wcf服务中调用该对象,然后将其传递给客户端应用程序,这样客户端应用程序将继续使用它 我在wcf中创建了数据契约,如下所示: [DataContract] public class Test { [DataMember] public dllCustomObjectType M

我有下面的场景

我的环境是Visual Studio 2010,Framework 4.0

有一个dll我无法控制,其中包含某些(相当复杂的)对象。我需要在wcf服务中调用该对象,然后将其传递给客户端应用程序,这样客户端应用程序将继续使用它

我在wcf中创建了数据契约,如下所示:

  [DataContract]
    public class Test
    {       
        [DataMember]
        public dllCustomObjectType MyTest;
    }
然后,我为该数据合同创建了一个接口:

 interface ITest
    {    
        [OperationContract]
        dllCustomObjectType GetMyTest(int Id);
    }
然后实现接口,并在客户端应用程序中使用实现的方法

客户端应用程序引用了我无法控制的同一个dll

当我尝试运行它时(事实上,即使在我更新服务引用时),我得到一个错误,即请求失败,元数据包含一个无法解析的引用

我可以在数据契约中复制该对象(这是一项艰巨的工作),但我想知道是否有一种方法可以在不重新创建对象的情况下将该对象类型的值传递给客户机应用程序

我将感谢任何帮助


谢谢

尝试将命名空间添加到数据协定中

[DataContract(Namespace="namespace.sample.com")]

尝试将命名空间添加到数据协定中

[DataContract(Namespace="namespace.sample.com")]

为此,WCF需要知道如何将“dllCustomObjectType”转换为XML或从XML转换为“dllCustomObjectType”。也就是说,“dllCustomObjectType”类型需要是一种在设计时考虑到序列化的类型,由DataContractSerializer识别(请参阅)。如果第三方DLL的创建者从未将该类型设计为支持序列化,则基本上需要为其编写自己的序列化/反序列化代码。您可以通过将该类型转换为自己的自定义类型(最简单)或通过创建数据约定代理()来实现。另一种选择是让自定义类型(如上面示例中的“Test”)实现一些动态序列化接口(如IXmlSerializable或ISerializable),您可以在其中手动序列化包含的“dllCustomObjectType”,然后在服务合约中使用Test而不是dllCustomObjectType。

要使其起作用,WCF需要知道如何将“dllCustomObjectType”转换为XML或从XML转换为“dllCustomObjectType”。也就是说,“dllCustomObjectType”类型需要是一种在设计时考虑到序列化的类型,由DataContractSerializer识别(请参阅)。如果第三方DLL的创建者从未将该类型设计为支持序列化,则基本上需要为其编写自己的序列化/反序列化代码。您可以通过将该类型转换为自己的自定义类型(最简单)或通过创建数据约定代理()来实现。另一种选择是让自定义类型(如上面示例中的“Test”)实现一些动态序列化接口(如IXmlSerializable或ISerializable),您可以手动序列化包含的“dllCustomObjectType”,然后在服务合同中使用Test而不是dllCustomObjectType。

谢谢Eugene,这就更清楚了。似乎在任何情况下都需要编写相当数量的代码。我不确定dll对象是否是在考虑序列化的情况下创建的,但即使不是,我也无法修改它。所以我将编写带有映射的自定义类型。谢谢Eugene,这使它更清晰。似乎在任何情况下都需要编写相当数量的代码。我不确定dll对象是否是在考虑序列化的情况下创建的,但即使不是,我也无法修改它。所以我将编写带有映射的自定义类型。