在WCF中序列化IDictionary <string,object =“”> </string,>

时间:2010-11-19 02:52:59

标签: wcf serialization

我们有一个现有的应用程序,其中一个DTO对象的属性类型为IDictionary<string, object>

我现在正试图通过WCF服务公开此对象。这在某些情况下有效,但在一般情况下不适用。要演示此问题,请考虑以下两种方法:

[OperationContract]
public IDictionary<string, object> Test1()
{
    return new Dictionary<string, object>
    {
        { "testkey1", "newstringvalue"},
    };
}

[OperationContract]
public IDictionary<string, object> Test2()
{
    return new Dictionary<string, object>
    {
        { "testkey1", "newstringvalue"},
        { "testkey2", new object [] { "one" , "two", "three", } }
    };
}

方法Test1()按预期工作,但是当我调用Test2()时,我在客户端上遇到一个奇怪的运行时错误:

  

请求频道超时了   在00:01:00之后等待回复。   增加传递给的超时值   呼叫请求或增加   Binding上的SendTimeout值。该   分配给此操作的时间可能   是一段时间的一部分   超时。

     

内部异常:远程服务器   返回错误:(504)网关   超时。

尽管异常被立即抛出,即。我实际上不必等待一分钟来回应这个问题。服务器上没有显示错误。

我怀疑这是因为序列化程序无法序列化对象[],但这不是错误所指示的。

所以我的问题是:

  1. 这里发生了什么?
  2. 如何解决此问题,以便正确序列化我的对象?
  3. 感谢。

2 个答案:

答案 0 :(得分:0)

我认为您需要使用KnownTypeAttribute将object []添加到已知类型,以使第二种情况起作用,因为这就是您在字典中添加的内容。

在任何情况下,要查看服务器上的实际错误,您需要打开WCF跟踪(或者在每个异常停止的模式下运行调试器,即使它已被捕获)

答案 1 :(得分:0)

由于我或我的任何同事都没有想到直接使这个序列化工作的方法,我们最终解决了这个问题,将对象包装在一个自定义对象中,该对象将Dictionary<string, object>转换为Dictionary<string, string>,它具有为字符串数组定义的特殊序列化案例。然后我们更改了应用程序以了解这一点。不是特别优雅,但足够简单,似乎有效。