Si no se puede especificar los subtipos de atributos (ya que no se conoce en tiempo de compilación) tiene 2 opciones (ambos de los cuales sólo se aplican a "v2", disponible como beta):
- utilice un
RuntimeTypeModel
, en lugar de los métodos estáticos Serializer
(que ahora son solo un atajo a RuntimeTypeModel.Default
); dice el modelo de la herencia (ejemplo siguiente)
DynamicType = true
añadir a la [ProtoMember(...)]
en cuestión
La segunda es no protobuf muy puro - se incrusta información de tipo, que en realidad no me amor pero las personas solo mantienen pidiendo. El primero es mi opción preferida. Para agregar subtipos en tiempo de ejecución:
var model = TypeModel.Create();
var type = model.Add(typeof(YourBaseType), true);
var subTypeA = model.Add(typeof(SomeSubType), true);
var subTypeB = model.Add(typeof(SomeOtherSubType), true);
type.AddSubType(4, typeof(SomeSubType));
type.AddSubType(5, typeof(SomeOtherSubType));
la true
en los medios anteriores "usan reglas normales para agregar propiedades de miembro de forma automática" - también se puede tomar el control de eso y especificar las propiedades (etc) de forma manual, si lo prefiere.
Tenga en cuenta que un TypeModel
debe almacenarse en caché y reutilizarse (no creado por objeto que necesita serializar), ya que incluye un código de "emisión" para generar métodos. Reutilizarlo será más rápido y requerirá menos memoria. El modelo de tipo es seguro para subprocesos y se puede utilizar para serializar/deserializar múltiples flujos simultáneamente en diferentes subprocesos.
Muy bien, gracias. Eso es lo que quería hacer, pero no estaba seguro de cómo funcionó exactamente.El mapeo automático de propiedades es un buen toque. Íbamos a hacer eso con los atributos post-compilación de postharp, pero esto es mucho mejor. –
@Heavy para aclarar, en este caso "automático" significa "de algo como XmlElement, DataMember o ProtoMember". There * is * también soporte incorporado para campos implícitos ordenados alfabéticamente pero es más frágil; debe tener cuidado con eso. –
@Marc ** 1) ** ¿Puedo definir algunos subtipos del mismo tipo de base usando atributos y luego agregar algunos más en el tiempo de ejecución? ** 2) ** ¿Por qué son necesarias las líneas 3 y 4 en su código? ¿No son redundantes si agrega las líneas 5ª y 6ª? – Rotem