protobuf-сеть v2 альфа - проблемы со Словарем <строка, строка>?

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

{"Никакой сериализатор не определил для типа: Система. Наборы. Универсальный. KeyValuePair '2 [[Система. Строка, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089], [Система. Строка, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"}

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

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

1
задан Steve 16 June 2010 в 22:53
поделиться

1 ответ

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


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

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

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

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

2
ответ дан 2 September 2019 в 23:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: