protobuf-net v2 alpha - проблемы со словарем <строка, строка>? - PullRequest
1 голос
/ 17 июня 2010

Несколько недель назад я довольно успешно использовал версию v2 protobuf-net. (Я хочу использовать V2 из-за скорости скомпилированного сериализатора, работающего на Compact Framework.) Все работало отлично, пока я не попытался сериализовать объект со свойством типа Dictionary. Я получил следующую ошибку:

{"Не определен сериализатор для типа: System.Collections.Generic.KeyValuePair`2 [[System.String, mscorlib, Версия = 2.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089], [System.String, mscorlib, Версия = 2.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089]] "}

Похоже, что недавно были сделаны изменения для улучшения поддержки Словаря, поэтому я взял последний код за сегодня. После сборки dll CF3.5 и FF3.5 я попытался снова. Теперь я получаю другую ошибку «Модель не может быть изменена после замораживания». Если я удалю атрибут ProtoMember из свойства Dictionary, то все будет работать нормально.

Кто-нибудь успешно использовал словарь в v2 protobuf-net? Это еще слишком рано, чтобы использовать релиз? Мои тесты скорости показали, что v2 в два раза быстрее, кажется ли это точным (подтверждая мое желание использовать менее стабильные пре-альфа-биты v2.)

1 Ответ

2 голосов
/ 18 июня 2010

Это представляет определенный интерес.У вас есть конкретная демонстрация, которую я могу использовать для расследования?(Я автор)


Проблема просто ошибка;во время Compile() она должна каскадировать модель, чтобы увидеть, какие другие типы нужны.Это не делает этого в данный момент (но скоро ; p).В обычном .NET (с RuntimeTypeModel) это не проблема - он может добавить дополнительный тип на лету.Но на CF (или на любом статически скомпилированном dll) это невозможно.

Пока исправлено Compile(), обман здесь, чтобы сказать ему, что еще ему нужно.Самый простой способ - прикоснуться к индексатору для KeyValuePair<string,string>:

model.Add(typeof(Parent), true);
var discard = model[typeof(KeyValuePair<string, string>)];
model.Compile(...);

Нам не нужно значение, возвращаемое этим индексатором (в discard) - нам просто нужно, чтобы оно было выполнено для заполнениянекоторые пробелы перед вызовом compile.

...