Protobuf-net bukan Daftar serialisasi

Sep 29 2020

Saat ini saya bereksperimen dengan protobuf-net (v3.0.29) dan mencoba untuk membuat serial / deserialisasi beberapa kelas sederhana. Dari contoh kerja minimal, saya tidak mengerti mengapa protobuf-net membuat serialisasi / deserialisasi yang sederhana List<int> Valueke daftar tanpa elemen.

    public enum BigEnum { One, Two }

    [ProtoContract]
    public class Container
    {
        [ProtoMember(1)]
        public BigEnum Parameter { get; private set; }
        [ProtoMember(2)]
        public List<int> Value { get; set; }
        public Container()
        {
            Parameter = BigEnum.One;
            Value = new List<int>();
        }
    }
    static class Program
    {
        static void Main(string[] args)
        {
            Container data = new Container();
            data.Value.Add(-1);
            data.Value.Add(1);

            MemoryStream memStream = new MemoryStream();
            Serializer.Serialize<Container>(memStream, data);
            var result = Serializer.Deserialize<Container>(memStream);
        }
    }

File protobuf ini dibuat oleh Serializer.GetProto () dan terlihat bagus bagi saya. Bagaimana kita dapat memproses List<int> Valuedengan benar dan dapatkah protobuf-net menangani struktur yang lebih kompleks seperti List<KeyValuePair<String, String>>atau di Dictionary<int,double>dalam kelas? Ada beberapa posting yang sangat lama untuk protobuf-net dengan kamus sekitar tapi saya tidak tahu bagaimana keadaan saat ini.

syntax = "proto3";
package NetCoreProtobuf;

enum BigEnum {
   One = 0;
   Two = 1;
}
message Container {
   BigEnum Parameter = 1;
   repeated int32 Value = 2 [packed = false];
}

Jawaban

1 MarcGravell Sep 28 2020 at 23:18

Sangat sederhana: Anda tidak memundurkan aliran, jadi aliran membaca dari posisi saat ini - di akhir aliran, dengan nol byte untuk dibaca. Kebetulan nol byte benar - benar valid dalam protobuf, jadi tidak dapat benar-benar memunculkan pengecualian di sini, karena Anda mungkin sepenuhnya benar dalam deserialisasi nol byte.

Serializer.Serialize<Container>(memStream, data);
memStream.Position = 0;
var result = Serializer.Deserialize<Container>(memStream);

Atau lebih sederhana: gunakan DeepClonemetode:

var clone = Serializer.DeepClone(data);