2011-12-02 13 views
6

Come posso ottenere v2 di protobuf-net per ignorare il fatto che la mia classe implementa ICollection, IEnumerable, etc?Forza protobuf-net per ignorare le interfacce IEnumerable/ICollection

Per questo particolare scenario, desidero solo che i campi contrassegnati come [ProtoMember] siano serializzati.


Attualmente sono in fase di conversione dall'utilizzo di protobuf-net v1 all'utilizzo di v2. Ho una struttura particolare che ora sta serializzando in modo errato a causa del cambiamento. Sembra qualcosa di simile al seguente:

[ProtoContract] 
public class FileTree : ICollection<FilePath>, IEnumerable<FilePath>, IEnumerable, INotifyCollectionChanged, INotifyPropertyChanged { 

    private FileTreeNode _Root; 

    [ProtoMember (1)] 
    public FileTreeNode Root { 
     get { return _Root; } 
     set { _Root = value; } 
    } 
} 

La classe FileTree è stato scritto a crollare i percorsi dei file come "C: \ happy.txt" "C: \ history.txt" in qualcosa di più simile

"C:\h" 
└─── "appy.txt" 
└─── "istory.txt" 

La struttura elimina la ridondanza nelle stringhe del percorso. Quindi, davvero non voglio che la classe FileTree sia serializzata tramite le funzioni IEnumerable perché in questo modo viene memorizzata come "C: \ happy.txt", "C: \ history.txt", ecc. In questo momento, nella serializzazione di un oggetto FileTree, ogni percorso viene stampato completamente.


EDIT: Un'ultima cosa vorrei ricordare - ho una funzione On_Deserialization in FileTree che viene etichettato con [ProtoAfterDeserialization]. Inserisco un punto di interruzione nella funzione, ma non viene colpito. Questo è legato al modo in cui questa classe viene serializzata?

+0

Non sono * consapevole * che si è trattato di un cambio di interruzione tra v1 e v2; forse la sottile differenza è che v1 cercava di più per 'IList ', o una combinazione di 'IEnumerable ' ** con ** un pubblico 'Aggiungi'. –

risposta

7
[ProtoContract(IgnoreListHandling = true)] 
public class FileTree : ICollection<FilePath> ... 
{ ... } 

dovrebbe farlo. Onestamente non penso di aver preso in considerazione i callback sulle liste, dal momento che sono gestiti in modo molto diverso dalle entità, ma con quanto sopra dovrebbe funzionare. Fammi sapere se non è così.

Dalla documentazione intellisense:

Ottiene o imposta un valore che indica che questo tipo non dovrebbe essere trattata come una lista, anche se ha caratteristiche lista simile familiari (enumerabile, aggiungere, etc)

+0

Grazie! Mi dispiace disturbarla con questo quando la risposta è stata così ovvia in retrospettiva. Stavo cercando in tutti i posti sbagliati per la risposta. – Amanduh

+0

@Amanduh la maggior parte delle cose è ovvia quando si conosce la risposta, tuttavia - questa era una domanda valida e valida, che fortunatamente * ha * una risposta conveniente (non fino a poco tempo fa) –

+0

@MarcGravell Si noti che l'opzione IgnoreListHandling potrebbe non funzionare come previsto in un po 'più [complesso] (https://code.google.com/p/protobuf-net/issues/detail?id=287&q=IgnoreListHandling) [scenari] (https://code.google. com/p/protobuf-net/temi/dettaglio? id = 348 & q = IgnoreListHandling). – tm1