wcf netdatacontractserializer исключение, сериализующее идиктивное с перечислением в качестве ключа - PullRequest
0 голосов
/ 02 июня 2011

Я использую NetDataContractSerialiser с WCF. Это хорошо работает с сериализацией всех наших типов. Однако служба, которую я вызываю, генерирует следующее исключение

Форматировщик выдал исключение при попытке десериализации сообщения:

Произошла ошибка при попытке десериализации параметра 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 = нейтральный, PublicKeyToken = null]] 'не найден в сборке' mscorlib, Version = 2.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089 '. Убедитесь, что сериализуемый тип имеет тот же контракт, что и десериализованный тип, и используется та же сборка. '. Пожалуйста, смотрите InnerException для более подробной информации.

У сериализуемого класса есть свойство, определенное как

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

объявление перечисления

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

который определен в другом ассемблере.

Когда я заменяю перечисление на int, класс десериализуется без проблем. Любые идеи, почему использование enum приведет к исключению?

Причиной использования NetDataContractSerializer была доступность информации о типе и отсутствие необходимости использовать KnownType

Ответы [ 2 ]

1 голос
/ 14 июня 2012

Сделать базовый тип не целочисленным для вашего перечисления. например байт.

Пример:

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

Подробности в моем следующем сообщении: dotnet-35-to-dotnet-40-enum

0 голосов
/ 02 июня 2011

Попробуйте пометить enum с [DataContract] вместо [Serializable]. Но похоже, что тип enum на клиенте вообще неизвестен.

...