1

我有以下情况。

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

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

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

我将不胜感激任何帮助。

谢谢!

4

2 回答 2

2

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

于 2012-10-13T08:44:07.077 回答
0

尝试将命名空间添加到您的数据合同

[DataContract(Namespace="namespace.sample.com")]
于 2012-10-12T22:13:34.500 回答