2011-12-24 23 views
16

estoy serializar una estructura mediante el uso de BinaryFormatter utilizando este código:no marcadas como serializable error al serializar una clase

private void SerializeObject(string filename, SerializableStructure objectToSerialize) 
{ 
    Stream stream = File.Open(filename, FileMode.Create); 
    BinaryFormatter bFormatter = new BinaryFormatter(); 
    bFormatter.Serialize(stream, objectToSerialize); 
    stream.Close(); 
} 

Qué objectToSerialize es mi estructura, llamaré a esta función como esta:

SerializableStructure s = new SerializableStructure(); 
s.NN = NN; 
s.SubNNs = SubNNs; 
s.inputs = inputs; 
SerializeObject(Application.StartupPath + "\\Save\\" + txtSave.Text + ".bin", s); 

Que SerializableStructure, y Tipo de NN, SubNNs y las entradas son serializables. (las entradas contienen algunas Points, Rectangles y listas genéricas).

Ahora, Cuando ejecuto mi código, me da este error:

Type 'MainProject.Main' in Assembly 'MainProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

Por qué me dan este error? Principal es mi formulario, y estas variables se encuentran en mi formulario.

He serializado con éxito Tipo de NN con MemoryStream y VB.NET, pero no sé por qué me sale este error?

Aquí es la definición de mis estructuras:

SerializableStructure:

[Serializable()] 
public class SerializableStructure 
{ 
    public List<Inputs> inputs = new List<Inputs>(); 
    public NeuralNetwork NN; 
    public NeuralNetwork[] SubNNs; 
} 

Entradas:

[Serializable()] 
public class Inputs 
{ 
    public string XPath { get; set; } 
    public string YPath { get; set; } 
    public string ImagePath { get; set; } 
    public string CharName { get; set; } 
    public string CharBaseName { get; set; } 
    public List<double> x { get; set; } 
    public List<double> y { get; set; } 
    public List<double> DotsX { get; set; } 
    public List<double> DotsY { get; set; } 
    public List<Point> GravityCenters { get; set; } 
    public List<Rectangle> Bounds { get; set; } 

    public override string ToString() 
    { 
     return CharName; 
    } 

    public Inputs(string xPath, string yPath, string imagePath, string charName, string charBaseName) 
    { 
     XPath = xPath; 
     YPath = yPath; 
     ImagePath = imagePath; 
     CharName = charName; 
     CharBaseName = charBaseName; 
     x = new List<double>(); 
     y = new List<double>(); 
     GravityCenters = new List<Point>(); 
     Bounds = new List<Rectangle>(); 
    } 
} 

también NN es muy grande estructura (!).

+0

¿Podría proporcionar la definición de la estructura que está serializando? Me interesan los tipos de SubNN, NN y entradas. – dasblinkenlight

+0

@dasblinkenlight He actualizado mi pregunta. –

+0

¿NeuralNetwork tiene delegados? – dasblinkenlight

Respuesta

14

Esto casi significa que tiene un evento (u otro delegado, tal vez una devolución de llamada) en algún lugar de su modelo de objeto, que está tratando de ser serializado. Agregue [NonSerialized] a cualquier campo de respaldo de eventos. Si está utilizando un evento de campo como (el tipo más común), esto es:

[field:NonSerialized] 
public event SomeDelegateType SomeEventName; 

alternativa: la mayoría de los serializadores no se ven en los eventos/delegados, y proporcionar una mejor versión de compatibilidad. Cambiar a XmlSerializer, JavaScriptSerializer, DataContractSerializer o protobuf-net (solo 4 ejemplos) también resolvería esto con el simple enfoque de no intentar hacer esto (casi nunca se pretende que los eventos sean considerados como parte de un DTO).

+0

mi clase NN en lenguaje VB.NET, ¿cómo puedo configurar los eventos en NonSerialized en VB.NET? –

+0

@Mahdi les gusta esto: http://stackoverflow.com/questions/4377806/vb-net-event-declaration-adding-nonserialized-attribution –

3

El problema es que está intentando serializar una clase derivada de Formulario. La clase Form es fundamentalmente no serializable. Tiene una cantidad enorme de estado interno que depende en gran medida del tiempo de ejecución. Eso comienza con una propiedad obvia como Handle, un valor que siempre es diferente. Menos obvias son propiedades como Tamaño, dependiendo de las preferencias del usuario como el tamaño de la fuente para el título de la ventana. Termina con todo el texto, la ubicación y los tamaños para los controles, están sujetos a localización. Las probabilidades de que un objeto de formulario en serie se pueda deserializar adecuadamente en cualquier lugar en cualquier momento para crear una copia exacta del formulario son cero.

Microsoft no hizo ningún comentario cuando escribieron el código, simplemente omitieron el atributo [Serializable] de la declaración de clase. Por eso obtienes la excepción.

Deberá apuntar más abajo, escriba su propia clase para capturar el estado de su formulario. Y dale el atributo. Tendrá que escribir un montón de código que correlacione las propiedades de formulario y control con un objeto de esa clase, hacia adelante y hacia atrás.

+0

Mi interpretación de la pregunta es que el formulario que se incluyó fue una sorpresa inesperada –

+0

Fair call , deseamos poder ver la definición de SerializableStructure. Ojalá el OP se diera cuenta de que importa :) –

+0

@Marc - Tengo curiosidad por saber una cosa, ¿cómo sabías que alguien más había respondido a esta pregunta? Accidente, herramienta o implacablemente haciendo un seguimiento? –

Cuestiones relacionadas