Domanda

Ho un List<object> con diversi tipi di oggetti come numeri interi, stringhe e tipi personalizzati.Tutti i tipi personalizzati sono protobuf-regolato.Quello che voglio fare ora è quello di serializzare / deserializzare questo elenco con protobuf.net.Fino ad ora ho il sospetto che devo dichiarare ogni tipo in modo esplicito, il che purtroppo non è possibile con questi mista-elenco costrutti.Perché il binario formater non ha problemi a fare queste cose, spero che mi mancava qualcosa e che mi può aiutare.Quindi la mia domanda è come trattare con gli oggetti protobuf.net.

È stato utile?

Soluzione

(disclosure:Io sono l'autore di protobuf-net)

BinaryFormatter è basata sui metadati serializzatore;cioèinvia .NET tipo di informazioni su tutti gli oggetti serializzati.protobuf-net è un contratto basato su serializzatore (l'equivalente binario di XmlSerializer / DataContractSerializer, che anche rifiutare questo).

Attualmente non esiste un meccanismo per il trasporto di arbitrario gli oggetti, visto che gli altri ne dovranno alcun modo di sapere ciò che si sta inviando;tuttavia, se si dispone di un insieme noto di diversi i tipi di oggetto che si desidera inviare, ci possono essere opzioni.C'è anche il lavoro in cantiere per consentire runtime-extensible schemi (piuttosto che solo gli attributi, che sono fissati a costruire), ma questo è ben lungi dall'essere completo.


Questo non è l'ideale, ma funziona...dovrebbe essere più facile quando ho completato il lavoro di supporto runtime schemi:

using System;
using System.Collections.Generic;
using ProtoBuf;
[ProtoContract]
[ProtoInclude(10, typeof(DataItem<int>))]
[ProtoInclude(11, typeof(DataItem<string>))]
[ProtoInclude(12, typeof(DataItem<DateTime>))]
[ProtoInclude(13, typeof(DataItem<Foo>))]
abstract class DataItem {
    public static DataItem<T> Create<T>(T value) {
        return new DataItem<T>(value);
    }
    public object Value {
        get { return ValueImpl; }
        set { ValueImpl = value; }
    }
    protected abstract object ValueImpl {get;set;}
    protected DataItem() { }
}
[ProtoContract]
sealed class DataItem<T> : DataItem {
    public DataItem() { }
    public DataItem(T value) { Value = value; }
    [ProtoMember(1)]
    public new T Value { get; set; }
    protected override object ValueImpl {
        get { return Value; }
        set { Value = (T)value; }
    }
}
[ProtoContract]
public class Foo {
    [ProtoMember(1)]
    public string Bar { get; set; }
    public override string ToString() {
        return "Foo with Bar=" + Bar;
    }
}
static class Program {
    static void Main() {
        var items = new List<DataItem>();
        items.Add(DataItem.Create(12345));
        items.Add(DataItem.Create(DateTime.Today));
        items.Add(DataItem.Create("abcde"));
        items.Add(DataItem.Create(new Foo { Bar = "Marc" }));
        items.Add(DataItem.Create(67890));

        // serialize and deserialize
        var clone = Serializer.DeepClone(items);
        foreach (DataItem item in clone) {
            Console.WriteLine(item.Value);
        }
    }
}

Altri suggerimenti

List<YourClass> list;
ProtoBuf.Serializer.Deserialize<List<YourClass>>(filestream);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top