【问题标题】:WCF deserialization of Dictionary where Enum type is key以枚举类型为键的字典的 WCF 反序列化
【发布时间】:2011-01-15 14:52:12
【问题描述】:

我想请你帮忙。我在这里遇到了使用枚举类型作为键的字典的 WCF 反序列化问题。

我有两个数据对象:

[DataContract] 
public enum MyEnum : int
{
   [EnumMember]
   Value1 = 0,
   [EnumMember]
   Value2 = 1
}

[DataContract]
[KnownType(typeof(MyEnum))] 
public class ReturnData
{
   [DataMember]
   public IDictionary<Enum, string> codes;
}

实际上ReturnData 类包含更多数据成员,但它们对我的示例并不重要。

这些数据对象是通过方法返回的:

[OperationContract]
public ReturnData Method1()
{
 ReturnData data = new ReturnData();
 data.codes = new Dictionary<Enum, string>();
 data.codes.Add(MyEnum.Value1, "stringA");

 return data;
}

当我从客户端调用 Method1 时,会引发下一个异常:

格式化程序在尝试反序列化消息时抛出异常:尝试反序列化参数http://tempuri.org/:Method1Result 时出错。 InnerException 消息是“第 1 行位置 522 中的错误。元素“http://schemas.microsoft.com/2003/10/Serialization/Arrays:Key”包含“http://schemas.datacontract.org/2004/07/AMService:MyEnum”数据协定的数据。反序列化器不知道映射到该合约的任何类型。将与“MyEnum”对应的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将其添加到传递给 DataContractSerializer 的已知类型列表中。'

知道如何定义 ReturnData 类来解决这个问题吗?

注意:当我将 ReturnData 成员 codes 更改为用作关键数据类型 MyEnum 而不是 Enum public IDictionary&lt;MyEnum, string&gt; codes; 时,反序列化工作正常并且数据从服务器端传输到客户端没有问题。

感谢您的帮助。

【问题讨论】:

  • 嗨杰森!你得到这个问题的答案了吗?我对涉及的列表和字典有同样的问题。

标签: c# wcf dictionary serialization enums


【解决方案1】:

在你的类的顶部添加一个KnownType 属性。

using System.Runtime.Serialization;

[KnownType(typeof(MyEnum))]
[DataContract]
public class Foo {

}

【讨论】:

  • kime waza 感谢您的回答。但是,如果您再次检查我的课程 ReturnData,您会看到“KnownType”属性已经存在...
  • 是的,你有没有补充说,在我回答之后,我之前没看到? :) 您是否尝试过在服务器上使用 KnownType 属性重新生成客户端代理?
【解决方案2】:

这行不应该

data.codes = new Dictionary<Enum, string>();

成为

data.codes = new Dictionary<MyEnum, string>();

【讨论】:

  • 没有。无法编译:IDictionary codes = new Dictionary();
  • IDictionary 怎么样 = new Dictionary();
  • 是的,这行得通。它写在我原始帖子的注释部分。但问题是如何制作可序列化的 IDictionary 数据成员。
  • 啊抱歉,尝试将 [KnownType(typeof(MyEnum))] 放在 public enum MyEnum 的声明中,只是猜测
猜你喜欢
  • 2011-09-06
  • 2011-01-08
  • 2017-04-10
  • 1970-01-01
  • 2021-07-22
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多