Autor
|
Tema: Serializar objetos en XML (XmlSerialization, XDocument, XmlWriter, etc) (Leído 3,252 veces)
|
GonzaFz
|
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
Mensajes: 9.885
|
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: <Serializable> <XmlRoot("PacketInfo")> Public Class PacketInfo ' : Implements IXmlSerializable <XmlElement("Value")> Public Property Value As String Public Sub New() End Sub Public Sub New(ByVal value As String) Me.Value = value End Sub End Class
+ Dim piList As New List(Of PacketInfo) Dim pi1 As New PacketInfo("value1") Dim pi2 As New PacketInfo("value2") piList.AddRange({pi1, pi2}) ' Serialize Dim sr As New XmlSerializer(GetType(List(Of PacketInfo)), {GetType(PacketInfo)}) Using fs As New FileStream("Packets.xml", FileMode.Create) sr.Serialize(fs, piList) End Using ' Deserialize piList.Clear() Using fs As New FileStream("Packets.xml", FileMode.Open) piList = DirectCast(sr.Deserialize(fs), List(Of PacketInfo)) End Using sr.Serialize(Console.Out, piList)
¡Saludos!
|
|
« Última modificación: 1 Marzo 2017, 07:48 am por Eleкtro »
|
En línea
|
|
|
|
dato000
Desconectado
Mensajes: 3.034
|
Te dejo un ejemplo con c# que encontre en http://stackoverflow.com/questions/364253/how-to-deserialize-xml-documentPrimero 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: [Serializable()] public class Car { [System.Xml.Serialization.XmlElement("StockNumber")] public string StockNumber { get; set; } [System.Xml.Serialization.XmlElement("Make")] public string Make { get; set; } [System.Xml.Serialization.XmlElement("Model")] public string Model { get; set; } } [Serializable()] [System.Xml.Serialization.XmlRoot("CarCollection")] public class CarCollection { [XmlArray("Cars")] [XmlArrayItem ("Car", typeof(Car ))] public Car[] Car { get; set; } }
La funcion de deserizalizar y poder manejar las variables dentro de un streamreader, es decir, un string. CarCollection cars = null; string path = "cars.xml"; XmlSerializer serializer = new XmlSerializer (typeof(CarCollection )); StreamReader reader = new StreamReader (path );cars = (CarCollection)serializer.Deserialize(reader); reader.Close();
Y bueno, también es necesario utilizar bien la codificación correcta para tu paquete XML. <?xml version="1.0" encoding="utf-8"?> <CarCollection> <Cars> <Car> <StockNumber>1020</StockNumber> <Make>Nissan</Make> <Model>Sentra</Model> </Car> <Car> <StockNumber>1010</StockNumber> <Make>Toyota</Make> <Model>Corolla</Model> </Car> <Car> <StockNumber>1111</StockNumber> <Make>Honda</Make> <Model>Accord</Model> </Car> </Cars> </CarCollection>
Slds
|
|
|
En línea
|
|
|
|
GonzaFz
|
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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
ayuda, serializar c*
Programación C/C++
|
ktemo
|
2
|
2,395
|
14 Marzo 2012, 16:08 pm
por ktemo
|
|
|
al serializar, se sobreescriben los objetos, como puedo solucionarlo?
Java
|
Kenkox
|
2
|
5,847
|
30 Agosto 2012, 16:50 pm
por 4nc3str4l
|
|
|
Como serializar en c++? (dev c++)
Programación C/C++
|
fabian7593
|
3
|
5,395
|
25 Septiembre 2013, 08:33 am
por eferion
|
|
|
Serializar ConcurrentMap
Java
|
mapers
|
1
|
1,629
|
28 Febrero 2014, 17:21 pm
por 1mpuls0
|
|
|
Como puedo serializar un arreglo de objetos en java
Java
|
Soul_Eater
|
4
|
4,307
|
9 Mayo 2017, 02:58 am
por Soul_Eater
|
|