【问题标题】:wcf netdatacontractserializer exception serialising idictionary with enumeration as keywcf netdatacontractserializer 以枚举为键的异常序列化字典
【发布时间】:2011-09-06 21:17:49
【问题描述】:

我正在使用带有 WCF 的 NetDataContractSerialiser。这适用于我们所有被序列化的类型。但是,我正在调用的服务正在生成以下异常

格式化程序在尝试反序列化消息时抛出异常:

尝试反序列化参数http://tempuri.org/:xmlServiceObjIN 时出错。 InnerException 消息是“反序列化程序无法加载要反序列化的类型,因为类型 'System.Collections.Generic.EnumEqualityComparer'1[[GrantEd.Common.DomainModel.Code.Enums.enumFundingParameterContextKey, GrantEd.Common.DomainModel.Code, Version=14.0 .71.0,Culture=neutral,PublicKeyToken=null]]' 在程序集“mscorlib,版本=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”中找不到。 检查被序列化的类型是否与被反序列化的类型具有相同的合同,并且使用了相同的程序集。有关详细信息,请参阅 InnerException。

被序列化的类有一个属性定义为

public IDictionary<enumFundingParameterContextKey, string>  Context { get; set; }

枚举的声明是

[Serializable]
public enum enumFundingParameterContextKey
{
    [EnumMemberAttribute()]
    ClientId = 0,
    [EnumMemberAttribute()]
    EntitlementDefinitionId = 1
}

在另一个程序集中定义。

当我用 int 替换枚举时,类反序列化没有问题。任何想法为什么使用枚举会导致异常?

使用 NetDataContractSerializer 的原因是为了获得类型信息并避免使用 KnownType

【问题讨论】:

    标签: wcf enumeration netdatacontractserializer


    【解决方案1】:

    将基本类型设为枚举的非整数。例如一个字节。

    例子:

    [Serializable] public enum enumFundingParameterContextKey : byte
    {
        [EnumMemberAttribute()]
        ClientId = 0,
        [EnumMemberAttribute()]
        EntitlementDefinitionId = 1
    }
    

    详细信息在我的以下博客文章中:dotnet-35-to-dotnet-40-enum

    【讨论】:

      【解决方案2】:

      尝试使用[DataContract] 而不是[Serializable] 标记枚举。但看起来客户端上的枚举类型根本不知道。

      【讨论】:

      • 遗憾的是,在更改为使用 DataContract 后运气不佳。在客户端也验证了正确的组装。
      猜你喜欢
      • 1970-01-01
      • 2011-01-15
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 2017-11-27
      相关资源
      最近更新 更多