Следующий код работает как есть на WP7 и Windows, сейчас я пытаюсь запустить его на MonoDroid:
[ProtoContract]
public class SSDTO {
[ProtoMember(1)]
public Dictionary<string, string> Strings = new Dictionary<string, string>(50);
[ProtoMember(2)]
public Dictionary<string, int> Ints = new Dictionary<string, int>(50);
[ProtoMember(3)]
public Dictionary<string, byte[]> Bytes = new Dictionary<string, byte[]>(10);
}
public class SettingStore {
public event EventHandler ContentsChanged;
private Dictionary<string, string> _StringVals;
private Dictionary<string, int> _IntVals;
private Dictionary<string, byte[]> _ByteVals;
public SettingStore() {
_StringVals = new Dictionary<string, string>(50);
_IntVals = new Dictionary<string, int>(50);
_ByteVals = new Dictionary<string, byte[]>(10);
}
private SettingStore(SSDTO source) {
_StringVals = source.Strings;
_IntVals = source.Ints;
_ByteVals = source.Bytes;
}
// Удалены средства доступа
public static SettingStore DeSerialize(Stream data) {
return new SettingStore(Serializer.Deserialize<SSDTO>(data));
}
public void Serialize(Stream Target) {
Serializer.Serialize<SSDTO>(Target, toDTO());
}
private SSDTO toDTO() {
return new SSDTO { Ints = this._IntVals, Strings = this._StringVals, Bytes = this._ByteVals };
}
}
Полученное исключение:
System.InvalidOperationException: не определен сериализатор для типа: System.Collections.Generic.KeyValuePair`2 [[System.String, mscorlib, Version = 2.0.5.0, Culture = нейтральный,PublicKeyToken = 7cec85d7bea7798e], [System.String, mscorlib, версия = 2.0.5.0, культура = нейтральная, PublicKeyToken = 7cec85d7bea7798e]] в ProtoBuf.Meta.ValueMember.BuildSerializer () [0x00000Meta.get_Serializer () [0x00000] в: 0 в ProtoBuf.Meta.MetaType.BuildSerializer () [0x00000] в: 0 в ProtoBuf.Meta.MetaType.get_Serializer () [0x00000] в: 0 в ProtoBuf.MepeEКлюч Int32, значение System.Object, ProtoBuf.ProtoWriter dest) [0x00000] в: 0 в ProtoBuf.Meta.TypeModel.SerializeCore (ProtoBuf.ProtoWriter Writer, значение System.Object) [0x00000] в: 0 в ProtoBuF.Me,Сериализация (System.IO.Stream dest, значение System.Object, контекст ProtoBuf.SerializationContext) [0x00000] в: 0 в ProtoBuf.Meta.TypeModel.Serialize (System.IO.Stream dest, значение System.Object) [0x00000] в: 0 в ProtoBuf.Serializer.Serialize [SSDTO] (назначение System.IO.Stream, экземпляр ABC.SystemModel.SSDTO) [0x00000] в: 0 в ABC.SystemModel.SettingStore.Serialize (Цель System.IO.Stream) [0x00002] в C: \ CODE \ SettingStore.cs: 145
Я скомпилировал protobuf-net для Monodroid в выпуске из проекта monodroid в стволе исходного кода, который я взял 3-4 дня назад.