C sharp - Conocer el numero de bits de un objeto

 
Vista:

Conocer el numero de bits de un objeto

Publicado por ismael (9 intervenciones) el 09/06/2015 18:35:15
Hola, estoy tratando de serializar un objeto para enviarlo despues a un Cliente desde el Servidor. Aun estoy en ese paso.
Mi problema es el siguiente:

en mi clase main declaro un byte [] ar = new byte[Contador], pero necesito conocer previamente el tamaño de bytes de mi objeto para la serializacion porque sino me lanza una excepcion. Lo he solucionado usando un while con un contador y un try{}catch. Lo que hace es que si no consigue hacer la serializacion, vuelve a empezar incrementando el valor del array, pero me parece una autentica guarrada. Alguna otra solucion mas razonable? Gracias.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.InteropServices;
namespace PruebaSerializacion
{
	class Program
	{
		public static void Main(string[] args)
		{
		 	int Contador = 100;
            bool hecho = true;
            while(hecho){
            	try{
			Ejemplo ejemplo = new Ejemplo();
			byte [] ar = new byte[Contador];
			ejemplo.SetNumero(5);
 
 
			ClaseAGuardar guardador = new ClaseAGuardar();
			guardador.SetDatos(ejemplo);
 
 
			Serializador S = new Serializador(ar);
			S.Guardar(guardador);
			hecho = false;
			Ejemplo ejemplo2 = new Ejemplo();
			ejemplo2 = S.Cargar().GetDatos();
			Console.WriteLine("{0}", ejemplo2.GetNumero());
 
			}catch{
            	    Contador *= 100;
 
            	}
 
 
            }
 
			Console.ReadKey(true);
 
			// servidor tendra que mandar????? 
 
		}
	}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[Serializable]
	public class ClaseAGuardar
	{
 
		// este es el objeto que se guarda
		Ejemplo e;
		public ClaseAGuardar()
		{
		}
		public void SetDatos(Ejemplo e1){
			e = e1;
 
		}
		public Ejemplo GetDatos(){
			return e;
		}
 
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Serializable]
	public class Ejemplo
	{
		// la clase de prueba
		int numero;
		public void SetNumero(int n){
			numero = n;
 
		}
		public int GetNumero(){
			return numero;
 
		}
	}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[Serializable]
	public class Serializador
	{
		// se encarga de serailizar y deserializar
		byte[] nombre;
		public Serializador(byte[] nombreFich)
		{
			nombre = nombreFich;
		}
		public void Guardar(ClaseAGuardar objeto){
 
			IFormatter formatter = new BinaryFormatter();
			Stream stream = new MemoryStream(nombre,true);
 
			formatter.Serialize(stream, objeto);
 
 
 
			stream.Close();
		}
 
 
 
		public ClaseAGuardar Cargar(){
			ClaseAGuardar objeto;
			IFormatter formatter = new BinaryFormatter();
			Stream stream = new MemoryStream(nombre,true);
			objeto= (ClaseAGuardar) formatter.Deserialize(stream);
			stream.Close();
			return objeto;
		}
	}
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Conocer el numero de bits de un objeto

Publicado por David (60 intervenciones) el 10/06/2015 15:30:56
Si lo que quieres es serializar objetos para enviarlos entre cliente/servidor, mejor que a bytes sería como XML, puesto que es más estándar y sencillo de trabajar.

con este extensor serializas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static string Serialize<T>(this T value)
{
    if (value == null)
    {
        return string.Empty;
    }
    try
    {
        var xmlserializer = new XmlSerializer(typeof(T));
        var stringWriter = new StringWriter();
        using (var writer = XmlWriter.Create(stringWriter))
        {
            xmlserializer.Serialize(writer, value);
            return stringWriter.ToString();
        }
    }
    catch (Exception ex)
    {
        throw new Exception("An error occurred", ex);
    }
}

Y con este deserializas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static T Deserialize<T>(this String value)
{
    if (value == null)
    {
        return default(T);
    }
    try
    {
        var xmlserializer = new XmlSerializer(typeof(T));
        using (var ms = new MemoryStream(value))
        {
            ms.Position = 0;
            return (T)xmlserializer.Deserialize(ms);
        }
    }
    catch (Exception ex)
    {
        throw new Exception("An error occurred", ex);
    }
}

Después es tan sencillo como serializar/deserializar:

1
2
String xmlDeClase = guardador.Serialize();
ClaseAGuardar claseDeXml = xmlDeClase.Deserialize<ClaseAGuardar>();

Siendo xmlDeClase lo que envías al cliente, y en el cliente lo conviertes a claseDeXml para trabajar con él.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Conocer el numero de bits de un objeto

Publicado por ismael (9 intervenciones) el 10/06/2015 16:11:12
Ok, David, muchas gracias. Este código me va a servir más adelante. Lo que sucede es que no es para ninguna aplicacion real, solo estoy trasteando con el lenguaje y queira hacerlo en bytes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Conocer el numero de bits de un objeto

Publicado por David (60 intervenciones) el 10/06/2015 18:13:32
Si quieres en Bytes como si fuese C++, entonces no te queda otra que usar Marshalling, o implementar tú la conversión a Bytes y viceversa.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Conocer el numero de bits de un objeto

Publicado por ismael (9 intervenciones) el 10/06/2015 18:23:22
Pero entonces qué es lo que estoy haciendo yo con esta funcion? Creia que lo estaba serializando en bytes... Ahora si me he perdido...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void Guardar(ClaseAGuardar objeto){
 
 
 
			IFormatter formatter = new BinaryFormatter();
 
			Stream stream = new MemoryStream(nombre,true);
 
 
 
			formatter.Serialize(stream, objeto);
 
 
 
 
 
 
 
			stream.Close();
 
		}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Conocer el numero de bits de un objeto

Publicado por David (60 intervenciones) el 11/06/2015 12:05:10
De esa manera estás serializando un objeto ClaseAGuardar. Pero como lo estás haciendo en memoria (MemoryStream) y no lo estás devolviendo, pierdes la serialización.
Para recuperar el array de bytes tendrías que definir el método así:
1
2
3
4
5
6
7
8
public byte[] Guardar(ClaseAGuardar objeto)
{
     var formatter = new BinaryFormatter();
     var stream = new MemoryStream(nombre,true);
 
     formatter.Serialize(stream, objeto);
     return stream.ToArray();
}
Así te devuelve el objeto serializado como un array de bytes
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Conocer el numero de bits de un objeto

Publicado por ismael (9 intervenciones) el 22/06/2015 17:30:57
David, disculpa he estado liado y no he podido darte las gracias por tu respuesta. Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar