2010-11-09 13 views
11

¿Qué hay que hacer para serializar enumeraciones con protobuf-net? Obtengo el siguiente error al serializar una clase que tiene una propiedad enum, si el atributo DataMember se elimina de la declaración de propiedad funciona bien.serialización de protobuf-net enumeración

"System.InvalidOperationException: Sólo las clases-contrato de datos (y listas/arrays de tal) pueden ser procesados"

+0

¿Tiene un ejemplo? Esto debería funcionar bien ... –

+0

¡Hola Marc! Gracias por publicar sobre deseriazing List usando Protobuf.net. Tengo el mismo problema. Voy a publicar un ejemplo a continuación. –

Respuesta

14

I sospechoso en realidad son 2 escenarios diferentes , pero con respecto a la muestra de código agregada por Andrew, esto se debe a que no puede determinar (de antemano) qué hará con respecto a los valores predeterminados (de manera predeterminada, los datos se tratan como opcionales en el receptor) Hay 3 maneras de fijar esto:

1: añadir una enumeración con el valor 0 (desde 0 es siempre el valor por defecto de la CLI para los ceros), por ejemplo

public enum SiteType 
{ 
    Error = 0, 
    ... 

2: decir que el valor que debe utilizar por defecto:

[ProtoMember(10), DefaultValue(SiteType.Partition)] 
public SiteType Type { get; set; } 

3: indica al motor que realmente no tiene que preocuparse por ello, es decir, que se va a tener un valor:

[ProtoMember(10, IsRequired = true)] 
public SiteType Type { get; set; } 
+1

Gracias. ¡Ahora funciona! Con protobuf-net reduzco mi tráfico, acelero 10 veces con mi servicio WCF. Realmente es una buena manera de potenciar el rendimiento en ascenso. Creo que debería ser una forma común de trabajar con este protocolo \ net. Lamentablemente, no hay muchas muestras sobre la aplicación de protobuf.net con WCF –

+1

@Andrew, se notan los comentarios. Voy a tratar de mejorar eso. –

+0

Mi problema es que hemos estado serializando una lista de objetos y una de las propiedades no tiene IsRequired = true. Supongo que sería bueno en tal caso incluir una excepción interna. – Kimi

4

muestra:

[DataContract] 
[ProtoContract] 
public enum SiteType 
{ 
    [EnumMember] 
    [ProtoEnum] 
    Site = 1, 
    [EnumMember] 
    [ProtoEnum] 
    Partition = 2, 
    [EnumMember] 
    [ProtoEnum] 
    Module = 3 
} 

[DataContract] 
[Serializable] 
[ProtoContract] 
public class SiteDTO 
{ 
    [DataMember] 
    [ProtoMember(1)] 
    public int Id { get; set; } 
    ... 
    [DataMember] 
    [ProtoMember(10)] 
    public SiteType Type { get; set; } 
} 
+0

Gracias por el ejemplo Andrew. Lo tengo localmente ahora y lo solucionaré. I * imagine * simplemente se entusiasma al decidir que es un objeto complejo. Supongo que en mi uso de WCF simplemente nunca decoré las enumeraciones con '[DataContract]'. Aún no lo he comprobado, pero supongo que funciona bien si elimina los atributos en la enumeración. –

+0

cuando intento eso, el error que obtengo es acerca del valor de enunciado definitivo (¿es eso lo que ves?) Que no es realmente lo mismo que informa Al. Sin embargo, he agregado una respuesta que (creo) aborda * su * pregunta. –