Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Serialización en C#.

Iniciado por [Over], 23 de Enero de 2008, 09:33:03 AM

« anterior - próximo »

[Over]

Hola.

Antes de que nadie me salte al cuello y me diga que google y tal. En ello estoy pero también coloco esto aquí por si alguién ha hecho esto mismo antes.

Mi idea es tener clases que encapsulen datos y estos poder serializarlos para enviarlos por red y en el cliente desserializar (se dice asi?).

Bien, por ahora se que puedo hacerlo con clases de datos basicos como por ejemplo:

class CPersona
{
 int iEdad;
 int iNumeroHijos;
}

Pero mi duda está si tengo algo asi:
class CPersona
{
 int iEdad;
 int iNumeroHijos;
 std::vector<CHijos*> vHijos;
}

Y a su vez CHijos pudiera ser tal que así:
class CHijos
{
 int iEdad;
 int iNumeroPerros;
 std::vector<CPerros*> vPerros;
}

(la codificación no es C# pero bueno, haceros a la idea de como seria en C#).

Supongo que todo estó se podrá serializar un poco a mano... recorriendo los vectores y tal. Pero es para ver sir en C# existe algo automatico que haga todo esto.

De no ser así, si alguién ha hecho esto y me quiere decir formas, problemas,ventajas,etc.. que ha encontrado.

Gracias de antemano.

Un saludo.

vincent

Si utilitzas System.Xml.Serialization puedes poner como atributo a tu propiedad:


[XmlArray ("Hijos"), XmlArrayItem("Hijo", typeof(CHijo))]



Saludos,

Vicenç
Desarrollo en .Net y metodologías http://devnettips.blogspot.com

[Over]

Adjunto a esto...

La libreria C# que contendrá las clases de datos la voy a usar también en C++.

¿Como veis usar en aplicaciones C++ clases de datos contenidas en C#?.

¿Es muy coñazo hacerse el binding?.

Un saludo.

Lessman


Vicente

Hola!

al final ayer no me pude conectar así que no te vi :( Te contesto por aquí a alguna cosa:

- el equivalente de vector<cosas> en C# sería un List<T> y eso es serializable si sus elementos son serializables. Es decir pudes serializar List<Cosa> si Cosa es serializable. No hace falta que escribas código propio para esto :)

Las ventajas son:

- está tirao de hacer :)

El problema de esto es que:

- la serialización es lenta.
- la serialización ocupa más sitio del que te imaginas (un bool ocupa 64 bytes serializado, pues así suma y sigue).

Es decir, puedes hacerla funcionar muy rápido y casi sin problemas (serializas a un MemoryStream, mandas el array de bytes por un socket, los metes en un MemoryStream y desserializas al otro lado). Pero si necesitas poco tráfico o mucha velocidad lo mismo te encuentras problemas. O lo mismo no. Tendrías que probar.

Si no te vale luego puedes cambiar la serialización por una tuya propia (o alguna que veas por internet, hay muchísimos artículos del tema si buscas por Fast Binary Serialization C#, sobre todo en Codeproject).

Un saludo!

Vicente

[Over]

Muchas gracias a los dos.

Ya me parecia raro que fuera tan bonito serializar sin ninguna pega :). Todo tiene sus peguitas.

Pero haré pruebas con esa historia.

Aún asi mi server se va a enchufar a otras máquinas que me van a enviar mensajes como ellos quieran, es decir, sin formato de serializado ni nada... asi que tendré que hacer a mano lo de pasar de bytes[] a clases.

Luego al margen de esto, me gustaria que una vez tenga las clases de datos rellenas en C# poder usarlas en C++. ¿Como veis esto?.

El tema es que tengo que hacer un server que se enchufe a diversas maquinas que me van a enviar los mensajes como ellos quieran, no van a compartir cabeceras ni nada de eso... asi que tendré que ir haciendome un "traductor" de esos mensajes de diversas fuentes a una libreria comun de datos que luego me gustaria usar en aplicaciones tanto C# como C++.

¿Que opinais?.

Un saludo.

Vicente

Cita de: "[Over"]Aún asi mi server se va a enchufar a otras máquinas que me van a enviar mensajes como ellos quieran, es decir, sin formato de serializado ni nada... asi que tendré que hacer a mano lo de pasar de bytes[] a clases.

Sip, entonces no te queda más remedio que hacerlo a manita :(

Cita de: "[Over"]
Luego al margen de esto, me gustaria que una vez tenga las clases de datos rellenas en C# poder usarlas en C++. ¿Como veis esto?.

Tienes que wrappear las clases de C# en C++/CLI. Como supongo que en C++ estás bastante suelto no creo que te vaya a causar demasiados problemas. No es muy difícil, pero tendrás que leer algo e informarte para como se pasan y traducen algunos tipos complicados, que cosas es recomendable no hacer, etc etc.

Pero vamos, si vas bien de C++ en C++/CLI irás bien también ;) Un saludo!

Vicente

[Over]

Hola.

Gracias por la ayuda.

Si, tendré que ver cuanto de complicado es usar en C++. Supongo que igual de coñazo seria hacerlo alraves, tener las clases de datos en una dll de C++ y usarlos en C#.

Al final, como ya hablamos. Me tocará usar sockets de C# y hacerme el "serializado" de bytes a clases a mano.

Gracias de nuevo.

PD: A ver si me voy soltando en C# que me parece bastante majete.

Un saludo.

Vicente

Nosotros en Jade 2 tenemos un mini wrapper en C++/CLI de DX9 y va de pm y el tío que lo hizo no tardó demasiado tiempo (pero es muy bueno en C++ y C# :)

En lo de hacerlo en un sentido o en otro tienes razón, es lo mismo: necesitas el wrapper de C++/CLI.

Un saludo!

Vicente






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.