elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Serializar objetos en XML (XmlSerialization, XDocument, XmlWriter, etc)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Serializar objetos en XML (XmlSerialization, XDocument, XmlWriter, etc)  (Leído 3,252 veces)
GonzaFz

Desconectado Desconectado

Mensajes: 69


Ver Perfil WWW
Serializar objetos en XML (XmlSerialization, XDocument, XmlWriter, etc)
« en: 1 Marzo 2017, 00:42 am »

Estoy escribiendo un Packet Sniffer y lo que quiero hacer es cada vez que capturo un paquete, serializarlo a un archivo XML para poder procesarlo mas tarde.

Estuve analizando usar XmlSerialization que fue lo primero que encontre en google pero mi problema es que, por lo que vi, esta pensado para que cada vez que se serializa un objeto, este se guarde en un nuevo archivo (lo digo por el hecho de que escribe el archivo completo, incluyendo el namespace y etc). Si utilizo esto lo que ocurre es que tengo que mantener en memoria todos los paquetes que vayan llegando hasta que el usuario quiera dejar de capturar y luego recien escribir el archivo (uso excesivo de memoria).

Mi primera idea fue que cada vez que llegue un paquete, escribirlo en el archivo y liberar ese objeto, por lo que me parece que XDocument puede ser util en este caso, solo que voy a tener que escribir manualmente el proceso de serialización.

Basicamente lo que me gustaria saber, si ya manejaron la serialización xml, como me recomiendan haga este proceso.

Saludos


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: Serializar objetos en XML (XmlSerialization, XDocument, XmlWriter, etc)
« Respuesta #1 en: 1 Marzo 2017, 07:35 am »

Hola. Si el problema es que quieres serializar varios elementos del mismo tipo y en un mismo archivo, entonces serializa una colección de elementos, por ejemplo la colección genérica y serializable List(Of T).

Ejemplo con un tipo personalizado:

Código
  1. <Serializable>
  2. <XmlRoot("PacketInfo")>
  3. Public Class PacketInfo ' : Implements IXmlSerializable
  4.  
  5.    <XmlElement("Value")>
  6.    Public Property Value As String
  7.  
  8.    Public Sub New()
  9.    End Sub
  10.  
  11.    Public Sub New(ByVal value As String)
  12.        Me.Value = value
  13.    End Sub
  14.  
  15. End Class

+

Código
  1. Dim piList As New List(Of PacketInfo)
  2. Dim pi1 As New PacketInfo("value1")
  3. Dim pi2 As New PacketInfo("value2")
  4. piList.AddRange({pi1, pi2})
  5.  
  6. ' Serialize
  7. Dim sr As New XmlSerializer(GetType(List(Of PacketInfo)), {GetType(PacketInfo)})
  8. Using fs As New FileStream("Packets.xml", FileMode.Create)
  9.    sr.Serialize(fs, piList)
  10. End Using
  11.  
  12. ' Deserialize
  13. piList.Clear()
  14. Using fs As New FileStream("Packets.xml", FileMode.Open)
  15.    piList = DirectCast(sr.Deserialize(fs), List(Of PacketInfo))
  16. End Using
  17.  
  18. sr.Serialize(Console.Out, piList)

¡Saludos!


« Última modificación: 1 Marzo 2017, 07:48 am por Eleкtro » En línea



dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: Serializar objetos en XML (XmlSerialization, XDocument, XmlWriter, etc)
« Respuesta #2 en: 1 Marzo 2017, 22:53 pm »

Te dejo un ejemplo con c# que encontre en http://stackoverflow.com/questions/364253/how-to-deserialize-xml-document

Primero se usa un modelo, en el modelo se tiene que especificar los atributos de las propiedades, y deben ser atributos del tipo XML.


Here are the classes:

Código
  1. [Serializable()]
  2. public class Car
  3. {
  4.    [System.Xml.Serialization.XmlElement("StockNumber")]
  5.    public string StockNumber { get; set; }
  6.  
  7.    [System.Xml.Serialization.XmlElement("Make")]
  8.    public string Make { get; set; }
  9.  
  10.    [System.Xml.Serialization.XmlElement("Model")]
  11.    public string Model { get; set; }
  12. }
  13.  
  14.  
  15. [Serializable()]
  16. [System.Xml.Serialization.XmlRoot("CarCollection")]
  17. public class CarCollection
  18. {
  19.    [XmlArray("Cars")]
  20.    [XmlArrayItem("Car", typeof(Car))]
  21.    public Car[] Car { get; set; }
  22. }


La funcion de deserizalizar y poder manejar las variables dentro de un streamreader, es decir, un string.

Código
  1. CarCollection cars = null;
  2. string path = "cars.xml";
  3.  
  4. XmlSerializer serializer = new XmlSerializer(typeof(CarCollection));
  5.  
  6. StreamReader reader = new StreamReader(path);
  7. cars = (CarCollection)serializer.Deserialize(reader);
  8. reader.Close();


Y bueno, también es necesario utilizar bien la codificación correcta para tu paquete XML.

Código
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <CarCollection>
  3. <Cars>
  4.  <Car>
  5.    <StockNumber>1020</StockNumber>
  6.    <Make>Nissan</Make>
  7.    <Model>Sentra</Model>
  8.  </Car>
  9.  <Car>
  10.    <StockNumber>1010</StockNumber>
  11.    <Make>Toyota</Make>
  12.    <Model>Corolla</Model>
  13.  </Car>
  14.  <Car>
  15.    <StockNumber>1111</StockNumber>
  16.    <Make>Honda</Make>
  17.    <Model>Accord</Model>
  18.  </Car>
  19. </Cars>
  20. </CarCollection>


Slds
En línea


GonzaFz

Desconectado Desconectado

Mensajes: 69


Ver Perfil WWW
Re: Serializar objetos en XML (XmlSerialization, XDocument, XmlWriter, etc)
« Respuesta #3 en: 3 Marzo 2017, 22:15 pm »

Hola, gracias a los dos por responder.

Entiendo la idea que me plantean, es basicamente como hice mi solución actual (aunque en un futuro me gustaria cambiar).
El problema es que yo estoy haciendo un packet sniffer, y para usar esta idea tengo que mantener una lista con todos los paquetes hasta que el usuario decida terminar el programa.
No pasara nada si son unos minutos, pero si se deja mucho tiempo el uso de memoria seria excesivo e ineficiente (porque no hay razon de tener todos los paquetes en memoria cuando la idea es simplemente escribirlos a un archivo).

Es decir que lo que quiero lograr es que cada vez que se envie o reciba un paquete, escribirlo en un archivo y olvidarme de el.


Entiendo que esto lo puedo hacer manualmente con XDocument pero me interesa saber si no me estaré pasando por alto algo o mi idea de que la lista ocupara mucha memoria es erronea, ya que no soy de programar mucho.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ayuda, serializar c*
Programación C/C++
ktemo 2 2,395 Último mensaje 14 Marzo 2012, 16:08 pm
por ktemo
al serializar, se sobreescriben los objetos, como puedo solucionarlo?
Java
Kenkox 2 5,847 Último mensaje 30 Agosto 2012, 16:50 pm
por 4nc3str4l
Como serializar en c++? (dev c++)
Programación C/C++
fabian7593 3 5,395 Último mensaje 25 Septiembre 2013, 08:33 am
por eferion
Serializar ConcurrentMap
Java
mapers 1 1,629 Último mensaje 28 Febrero 2014, 17:21 pm
por 1mpuls0
Como puedo serializar un arreglo de objetos en java
Java
Soul_Eater 4 4,307 Último mensaje 9 Mayo 2017, 02:58 am
por Soul_Eater
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines