Простой код Protobuf-net, не работающий в MonoDroid с «Не определен сериализатор для типа» - PullRequest
1 голос
/ 07 октября 2011

Следующий код работает как есть на 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 дня назад.

1 Ответ

2 голосов
/ 07 октября 2011

Мне сообщили об этом несколько дней назад; это случайная регрессия из-за того, что Mono KeyValuePair имеет другие средства доступа, отличные от .NET, и новая обработка «кортеж» не соглашается с тем, что это подходящее совпадение (в основном, в Mono у них есть частные сеттеры, которые учитываются) ,

Я исправлю это в эти выходные и снова разверну. Мои искренние извинения.

...