2008-12-16 19 views
11

Estoy aprendiendo C# escribiendo a un administrador de la biblioteca del hogar.Guardar estructuras de datos en C#

Tengo un BookController que almacenará los libros en una estructura de datos y realizará operaciones en ellos.

¿Tiene C# una manera de guardar los datos en el diccionario en un archivo local, quizás en forma de XML para cargarlos más tarde, o tendré que escribirlos yo mismo?

¿Cuál es el mejor método para guardar y cargar esta información disponible para C#? Solo necesito señalar en una buena dirección.

Respuesta

23

En realidad, C# (el idioma) no sabe nada sobre la serialización, pero .NET (el marco) ofrece un montón de maneras ... XmlSerializer, BinaryFormatter, DataContractSerializer (.NET 3.0) - o también hay algunos frameworks de serialización hechos a medida.

Cuál utilizar depende de sus requisitos; BinaryFormatter es fácil de usar, pero graba la información de metadatos del ensamblado en el archivo, lo que la hace no portátil (no se puede abrir en Java, por ejemplo). XmlSerializer y DataContractSerializer están basados ​​principalmente en xml, lo que lo hace bastante portátil, pero bastante grande a menos que lo comprima.

Algunos serializadores de propiedad están a medio camino entre los dos; protobuf-net es un formateador binario (datos muy densos), pero que sigue un estándar portátil para el formato de datos (especificación de búferes de protocolo de Google). Si esto es útil depende de su escenario.

código típico (aquí usando XmlSerializer):

 XmlSerializer ser = new XmlSerializer(typeof(Foo)); 
     // write 
     using (var stream = File.Create("foo.xml")) 
     { 
      ser.Serialize(stream, foo); // your instance 
     } 
     // read 
     using (var stream = File.OpenRead("foo.xml")) 
     { 
      Foo newFoo = (Foo)ser.Deserialize(stream); 
     } 
1

Si desea que sus datos estén en formato XML, hay XmlSerializer.

EDITAR: Por alguna razón, he votado negativamente por sugerir esto porque XmlSerializer no puede serializar un diccionario.

Para solucionar este problema siempre se puede personalizar el proceso de serialización como this

+0

XmlSerializer no puede serializar Dictionary . –

+0

¿Quién dijo que esto es lo que @Coyote está usando? No es necesario votar a la baja, la respuesta no es * incorrecta *. Incompleto tal vez, pero solo una pista basta. Hay formas de XML de serializar un diccionario, si golpeas esa pared. – Tomalak

+0

Veo un diccionario como una optimización de búsqueda interna que no necesita estar expuesta en los datos. es decir, si la clave del diccionario es una propiedad de su objeto, entonces está hinchando la carga al tenerla allí dos veces y tener el código de envoltura adicional. IMO es una práctica de codificador de arrastrar y soltar para serializar diccionarios. –

1

También debe considerar la búsqueda de LINQ to SQL (o Entity Framework) para O mapeo/R y el almacenamiento de sus datos en una base de datos (SQL CE, SQL Exprimir).

1

He creado un método de extensión que toma un objeto y crea una cadena xml para usted, todo lo que necesita hacer es guardar/cargar desde el archivo. XmlSerialisation