2011-12-02 6 views
6

¿Cómo puedo obtener v2 de protobuf-net para ignorar el hecho de que mi clase implementa ICollection, IEnumerable, etc.?Fuerza protobuf-net para ignorar interfaces IEnumerable/ICollection

Para este escenario en particular, solo quiero que se serialicen los campos que he marcado como [ProtoMember].


Actualmente estoy en el proceso de convertir de usar protobuf-net v1 a usar v2. Tengo una estructura particular que ahora se está serializando incorrectamente debido al cambio. Se ve algo como lo siguiente:

[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 clase FileTree fue escrito para colapsar las rutas de archivos como "C: \ happy.txt" "C: \ history.txt" en algo más parecido

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

La estructura elimina la redundancia en las cadenas de ruta. Por lo tanto, realmente no quiero que la clase FileTree se serialice a través de las funciones de IEnumerable porque solo se almacena como "C: \ happy.txt", "C: \ history.txt", etc. En este momento, en la serialización de un objeto FileTree, cada ruta se imprime en su totalidad.


EDIT: Una última cosa que debería mencionar - Tengo una función On_Deserialization en FileTree que está etiquetado con [ProtoAfterDeserialization]. Puse un punto de interrupción en la función, pero no está siendo golpeado. ¿Esto está relacionado con la forma en que se está serializando esta clase?

+0

No estoy * al tanto * de que este fue un cambio radical entre v1 y v2; quizás la sutil diferencia es que v1 estaba buscando más para 'IList ', o una combinación de 'IEnumerable '** con ** un público' Add '. –

Respuesta

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

debería hacerlo. Honestamente, no creo haber considerado las devoluciones de llamadas en las listas, ya que se manejan de forma muy diferente a las entidades, pero con lo anterior debería funcionar. Avísame si no es así.

De la documentación intelisense:

Obtiene o establece un valor que indica que este tipo no debe ser entendido como una lista, incluso si tiene características familiares de lista como (enumerables, añadir, etc)

+0

¡Gracias! Perdón por molestarlo con esto cuando la respuesta fue tan obvia en retrospectiva. Estaba buscando en todos los lugares equivocados para la respuesta. – Amanduh

+0

@Amanduh la mayoría de las cosas son obvias cuando se conoce la respuesta, sin embargo, esta fue una pregunta válida y buena, que afortunadamente sucede * tiene * una respuesta conveniente (no fue hasta bastante recientemente) –

+0

@MarcGravell Tenga en cuenta que la opción IgnoreListHandling podría no funcionar como se esperaba en un poco más [complejo] (https://code.google.com/p/protobuf-net/issues/detail?id=287&q=IgnoreListHandling) [escenarios] (https://code.google. com/p/protobuf-net/issues/detail? id = 348 & q = IgnoreListHandling). – tm1