WCF自定义对象序列化

时间:2012-10-12 22:07:43

标签: .net wcf serialization

我有以下情况。

我的环境是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。

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

我可以在我的数据契约中复制该对象(这是很多工作),但我想知道是否有办法将该对象类型的值传递给客户端应用程序而无需重新创建对象。

我将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

尝试在数据合同中添加命名空间

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