2008-10-01 11 views
6

He creado un componente no visual en C#, que está diseñado como un marcador de posición para metadatos en un formulario.
El componente tiene una propiedad que es una colección de objetos personalizados, este objeto está marcado como Serializable e implementa GetObjectData para serilizing y public constuctor para deserilizing.
serialización de tiempo de diseño en C#

En el archivo resx del formulario generará datos binarios para almacenar la colección, sin embargo cada vez que hago un cambio a la clase serializada obtengo errores de diseñador y necesito eliminar los datos manualmente del archivo resx y luego recrea estos datos.

He intentado cambiar el Constuctor tener un bloque try/catch alrededor de cada propiedad de la clase

try 
{ 
    _Name = info.GetString("Name"); 
} 
catch (SerializationException) 
{ 
    this._Name = string.Empty; 
} 

pero todavía se bloquea. El último error que obtuve fue que tuve que implementar IConvertible.

Preferiría usar serialización xml porque al menos puedo verlo, ¿es posible para que lo use el diseñador?

¿Hay alguna manera de hacer que la serialización sea más estable y menos resistente a los cambios?

Editar:
Más información ... mejor descripción tal vez
tengo una clase que hereda de Component, que tiene una propiedad que es una colección de reglas. The RulesCollection parece tener que marcarse como Serializable, de lo contrario no conserva sus miembros.

La clase Rules es también un Componente con el atributo DesignTimeVisible (falso) para detenerlo en la bandeja de componentes, este clas no está marcado como Serializable.

Tener la colección marcada como Serializable genera datos binarios en el archivo resx (no es ideal) y el IDE informa que la clase Rules no se puede serializar.

Creo que este problema va más allá de una simple pregunta. Entonces probablemente lo cerraré en breve.
Si alguien tiene algún enlace a algo similar que ayudaría mucho.

Respuesta

2

Desde entonces, descubrí dónde me estaba yendo mal.

El componente que estaba implementando una colección personalizada (heredada de CollectionBase), cambié esto a una lista y agregué el atributo DesignerSerializationVisibility (DesignerSerializationVisibility.Content) a la propiedad List, esta lista también es de solo lectura. Esto produciría código para generar todas las propiedades de los componentes y todas las entradas en la lista.

La clase almacenada en la lista no necesita ningún atributo particular ni necesita ser serializable.

private List<Rule> _Rules; 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
public List<Rule> Rules 
{ 
    get { return _Rules; } 
} 
2

Es posible que desee probar el enfoque alternativo de hacer que todo se serialice como código generado. Hacer eso es muy fácil. Simplemente implemente su clase no visual desde Componente. A continuación, exponga su colección como ya lo está, pero asegúrese de que cada objeto colocado en la colección se deriva de Componente. Al hacer eso, todo es código generado.

+0

Parece que este método también produce datos serializados binarios, además de cada objeto de la colección está representado en la bandeja de componentes – benPearce

+0

evitar que aparece en la bandeja utilizando ... [ToolboxItem (false)] ... en la clase. Uso este enfoque todo el tiempo y no obtengo datos binarios. Entonces debes estar haciendo algo que obligue a que eso suceda. ¿Puedes publicar un fragmento de código? –

2

Podría poner más código de la clase que está teniendo el problema de serialización, tal vez el constructor y la propiedad para dar una referencia a las variables que está utilizando.

Sólo una nota: He tenido un montón de problemas con la generación diseñador y código visual, si tengo una propiedad en un control general a continuación pongo

[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden) ]

en la propiedad y manejar la inicialización yo mismo.

+0

¿De dónde sacas la iniciación? ¿Hay una interfaz requerida o está en el constructor? – benPearce

+0

En el constructor o en el evento OnLoad en el formulario – Jiminy

+0

Su sugerencia funcionó para los muchachos aquí en el trabajo. ¡Gracias! –

Cuestiones relacionadas