Проблема при использовании сериализатора protobuf-net для WCF

Мы используем protobuf-net для сериализации моего контракта данных WCF. При сериализации я получаю сообщение об ошибке «Дубликат тега 9 обнаружен в FingerPrint», есть предложения?

Я не использую никаких атрибутов, таких как [ProtoContract], [ProtoInclude] или [Protomember; Я использую [DataContract] и [DataMember] в своем классе.


person Vivek jain    schedule 28.01.2011    source источник
comment
Как выглядит отпечаток пальца?   -  person Marc Gravell    schedule 28.01.2011


Ответы (2)


protobuf-net будет (из-за отсутствия чего-то более явного) использовать Order из любых атрибутов [DataMember]; так - есть ли отмеченные 9? Как много? Каждый идентификатор должен быть уникальным для каждого типа в protobuf-net.

Можете ли вы добавить [ProtoMember], чтобы дать ему новый идентификатор? Если файл сгенерирован кодом, вы также можете иметь разделяемый класс с [ProtoPartialMember] для типа (не члена), чтобы добиться того же.

person Marc Gravell    schedule 28.01.2011
comment
У меня есть только одно свойство в классе, порядок которого равен 9. Порядок свойства FingerPrint равен 41. Я добавил атрибут [ProtoMember] для всех членов этого конкретного класса. Но все равно получаю ту же ошибку. Когда я сериализую то же самое с помощью DataContractSerilizer, тогда его работает нормально. Заранее спасибо. - person Vivek jain; 29.01.2011
comment
Выход DataContractSerilizer: - «Claim z:Id=i1» ‹SalvageStatus/› ‹ClaimId›0‹/ClaimId› ‹CheckApproved›true‹/CheckApproved› ‹Holds/› ‹NoEnrollment›false‹/NoEnrollment› ‹Peril i: ‹ClaimType i:nil=true/› ‹EndCallDetails i:nil=true/› ‹CheckDisclaimed›false‹/CheckDisclaimed› ‹LastModifiedBy i:nil=true/› ‹CallInformations i:nil=true/› ‹ Отпечаток пальца i:nil=true/› ‹/Claim› - person Vivek jain; 29.01.2011
comment
@vivek Боюсь, я не могу воспроизвести это. Если вы можете опубликовать (или отправить мне напрямую - см. профиль) что-то, что я могу использовать для воспроизведения, я, вероятно, смогу найти причину (должен отметить, что я автор этой библиотеки) - person Marc Gravell; 29.01.2011

о, gr8, спасибо за ответ, я разобрался, почему это произошло. Мои классы содержат одно или несколько свойств (элемент данных) с одинаковым порядком, т.е. порядок = 9, поэтому я получаю эту ошибку. Теперь я могу сериализовать и десериализовать свои классы, чтобы вы знали, столкнусь ли я с какой-либо другой проблемой. Было бы здорово, если бы вы сказали мне ограничение protobuf.net.

Я планирую заменить весь сериализатор этим. Еще одна вещь, которую я хочу добавить, этот сериализатор (protobuf.net) в 10 раз быстрее, чем BinarySearilizer (согласно моему тестовому приложению). Еще раз спасибо.

person Vivek jain    schedule 30.01.2011
comment
В первой строке почти все, что я уже сказал ;p И процитирую: у меня есть только одно свойство в классе, порядок которого равен 9. Ограничения? Работает с деревьями, а не с графами (что является распространенным явлением — XmlSerializer, JavaScriptSerializer и DataContractSerializer [по умолчанию] являются сериализаторами деревьев); не работает хорошо, если все, что вы знаете, это то, что ваш тип object... и это не друг MEX, но в остальном это круто ;p - person Marc Gravell; 30.01.2011
comment
Спасибо за ответ. Теперь я получаю другую ошибку. Подходящая кодировка набора правил по умолчанию не найдена. Мы используем System.Workflow.Activities.Rules.RuleSet как свойство класса, в то время как при сериализации возникает вышеуказанная ошибка. Даже я не могу сериализовать это с помощью сериализатора Datacontract, только NetDataContractSerializer может сериализовать. Что мне нужно сделать для сериализации с использованием ProtoBuf ? - person Vivek jain; 31.01.2011
comment
Я не видел ваш последний комментарий - я не получаю уведомления, если вы не укажете @Marc в тексте; RuleSet, вероятно, не предназначен для сериализации с помощью сериализатора на основе контракта (NetDataContractSerializer — это сериализатор на основе поля, который отличается). Обычно я бы рекомендовал заменить (в момент сериализации) RuleSet подходящим DTO. Однако трудно сказать, не зная больше о WF. - person Marc Gravell; 08.02.2011