2011-02-14 9 views
5

Tengo una clase pública que no se serializará correctamente. Cuando se intenta, se lanza la siguiente excepción:Tipo no es serializable porque no es público?

El tipo de contrato de datos 'MyProject.MyClass' no es serializable porque no es público. Hacer que el tipo sea público solucionará este error. Alternativamente, puede hacerlo interno y usar el atributo InternalsVisibleToAttribute en su ensamblaje para permitir la serialización de miembros internos; consulte la documentación para obtener más detalles. Tenga en cuenta que hacerlo tiene ciertas implicaciones de seguridad.

Mi clase es pública, sin embargo:

[DataContract] 
public class MyClass 
{ 
    [DataMember] 
    public string Name { get; set; } 

    [DataMember] 
    private int Count; 

    public MyClass() 
    { 
     Name = string.Empty; 
     Count = 0; 
    } 
} 

¿Por qué recibo esta excepción cuando la clase es claramente pública?

Respuesta

8

en Windows Phone 7, no se puede serializar los miembros privados:

Bueno, da la casualidad de que WP7 aplicaciones se ejecutan en un entorno de “confianza parcial” y fuera del Land “plena confianza” , DataContractSerializer se niega a serializar o deserializar miembros no públicos. Por supuesto, esa excepción fue absorbida internamente por .NET, así que todo lo que vi fue ese mensaje extraño sobre cosas que sabía con certeza que el público no era "público". Cambié todos los campos privados que estaba serializando a público y todo funcionó bien. http://geekswithblogs.net/mikebmcl/archive/2010/12/29/datacontractserializer-type-is-not-serializable-because-it-is-not-public.aspx

Cambiar el código para evitar serialización miembros privados corrige el problema.

2

Es posible que pueda corregir esto escribiendo serialización personalizada para esta clase. La serialización XML incorporada solo puede serializar propiedades públicas.

Puede realizar una de las siguientes acciones para evitar esta limitación:

  • Deshacerse del atributo DataMember en Count
  • Hacer Count pública
  • Implementar IXmlSerializable (o cualquier otra serialización lo que necesita), y serializar esos miembros privados manualmente
Cuestiones relacionadas