首页 文章

字典的WCF反序列化,其中枚举类型是关键

提问于
浏览
5

我想请你帮忙 . 我有这里的字典的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的数据 Contract . 反序列化器不知道映射到此 Contract 的任何类型 . 将与“MyEnum”对应的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将其添加到传递给DataContractSerializer的已知类型列表中 .

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

注意:当我更改 ReturnData 成员 codes 以用作密钥数据类型 MyEnum 而不是 Enum public IDictionary<MyEnum, string> codes; 时,反序列化正常工作,数据从服务器端传输到客户端没有问题 .

谢谢你的帮助 .

2 回答

  • 2

    在您的课程顶部添加 KnownType 属性 .

    using System.Runtime.Serialization;
    
    [KnownType(typeof(MyEnum))]
    [DataContract]
    public class Foo {
    
    }
    
  • 0

    不应该这样

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

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

相关问题