2011-10-03 8 views
5

Siguiendo con mi búsqueda para doblar protobuf-net a mi propia voluntad ..-protobuf neta herencia "árbol"

que he visto algunas preguntas en torno SO sobre cómo añadir subclases de forma dinámica para el serializador sea capaz de codificar la sub-clase .., como this o this

mi situación es algo diferente, tengo una clase base que pueda poner sub-clasificado en el código-delimitada tarde, y quiero serializar es como la clase BASE e ignora por completo los campos/propiedades de la subclase.

La razón por la que necesito esto, es que más adelante, cuando deserialice los datos, el código de la subclase no estará disponible, por lo que no será posible construir la subclase.

¿Hay alguna manera de limitar/prohibir la serialización de subclases?

En mi caso, tengo una lista donde algunos elementos de la lista son DerivedClass.

Me gustaría encontrar una manera de hacer protobuf-net serializar todo como BaseClass y para deserializar a BaseClass así ...

he intentado mirando en el código, pero no han encontrado algo demasiado útil .

Respuesta

2

Normalmente, la biblioteca es muy particular acerca de detectar clases derivadas y tratarlas de forma diferente a la clase base. La única excepción actual es clases proxy, en particular Entity Framework y NHibernate. Para una solución tidy, parece práctico agregar algún tipo de interruptor "ignorar subclases". Sin embargo, mientras que no existe, un muy vago (y hacky) enfoque sería hacer trampa utilizando el vigente para el manejo de NHibernate, por ejemplo:

namespace NHibernate.Proxy { 
    interface INHibernateProxy {} 
} 
... 
public class SomeDerivedType : BaseType, INHibernateProxy {} 

esto, entonces será automáticamente serializada según BaseType. Sin embargo, tiene un leve olor a trampas al respecto.

+0

¿Olor leve que dices? ;) Creo que piratearé el código fuente original pero, gracias por la sugerencia – damageboy

+1

@damageboy, si quisieras agregar algún mecanismo personalizado para esto, valdría la pena mirar 'TypeModel.ResolveProxies'. No estoy en contra de agregar una API específica de protobuf-net aquí. –

+0

Solo para que quede claro aquí ... ¿La razón por la que me está señalando hacia ResolveProxies es porque se llama desde ThrowUnexpectedSubtype como último recurso antes de lanzar la excepción? – damageboy

Cuestiones relacionadas