在WCF中序列化IDictionary <string,object>

我们有一个现有的应用程序,其中一个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之后等待回复时超时。 增加传递给请求调用的超时值或增加绑定上的SendTimeout值。 分配给此操作的时间可能是超时时间的一部分。

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

尽管事实上即时抛出异常,即。 我实际上并不需要等一分钟才能做出回应。 服务器上没有显示错误。

我怀疑这是源于串行器无法序列化对象[]的事实,但这不是错误所指示的。

所以我的问题是:

  • 这里发生了什么?
  • 我如何解决这个问题,以便我可以正确地序列化我的对象?
  • 谢谢。


    我认为您需要使用KnownTypeAttribute将已知类型的对象[]添加到第二种情况,因为这就是您要放入字典的内容。

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


    由于我或我的任何同事都不能想出一种方法来直接进行序列化,所以我们最终通过将对象包装在自定义对象中来处理问题,该自定义对象将Dictionary<string, object>转换为Dictionary<string, string> ,它为字符串数组定义了一个特殊的序列化大小写。 然后,我们更改了应用程序以了解这一点。 不是特别优雅,但很简单,似乎工作。

    链接地址: http://www.djcxy.com/p/93555.html

    上一篇: Serializing IDictionary<string, object> in WCF

    下一篇: WCF System.Object Serialization