wcf netdatacontractserializer异常序列化idictionary,枚举为关键

时间:2011-06-02 07:24:34

标签: wcf enumeration netdatacontractserializer

我正在使用带有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,Version = 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

2 个答案:

答案 0 :(得分:1)

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

示例:

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

详情请参阅我的以下博文:dotnet-35-to-dotnet-40-enum

答案 1 :(得分:0)

尝试使用[DataContract]代替[Serializable]来标记枚举。但看起来客户端上的enum类型是未知的。