【发布时间】:2008-12-16 07:08:47
【问题描述】:
我正在通过编写一个家庭图书馆管理器来学习 C#。
我有一个 BookController,它将书籍存储在数据结构中并对它们执行操作。
C# 是否有办法将字典中的数据保存到本地文件,可能以 XML 方式稍后加载,还是我必须自己编写?
在 C# 中保存和加载这些数据的最佳方法是什么?只需要指出一个好的方向。
【问题讨论】:
标签: c# serialization
我正在通过编写一个家庭图书馆管理器来学习 C#。
我有一个 BookController,它将书籍存储在数据结构中并对它们执行操作。
C# 是否有办法将字典中的数据保存到本地文件,可能以 XML 方式稍后加载,还是我必须自己编写?
在 C# 中保存和加载这些数据的最佳方法是什么?只需要指出一个好的方向。
【问题讨论】:
标签: c# serialization
实际上,C#(语言)对序列化一无所知,但 .NET(框架)提供了很多方法...XmlSerializer、BinaryFormatter、DataContractSerializer (.NET 3.0) - 或者也有一些定制的序列化框架。
使用哪个取决于您的要求; BinaryFormatter 使用简单,但会将程序集元数据信息刻录到文件中 - 使其不可移植(例如,您无法在 Java 中打开它)。 XmlSerializer 和 DataContractSerializer 主要是基于 xml 的,使其非常便携,但除非你压缩它,否则它相当大。
一些专有的序列化器介于两者之间; protobuf-net 是二进制格式化程序(数据非常密集),但它遵循数据格式的可移植标准(Google 的协议缓冲区规范)。这是否有用取决于您的场景。
典型代码(此处使用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);
}
【讨论】:
看看Serialization 和ISerializable interface
它允许您以可移植的形式保存对象的状态。
【讨论】:
您还应该考虑使用 Linq to SQL(或实体框架)进行 O/R 映射并将数据存储到数据库(SQL CE、SQL Express)中。
【讨论】:
我创建了一个扩展方法,它接受一个对象并为您创建一个 xml 字符串,您需要做的就是从文件中保存/加载。 XmlSerialisation
【讨论】:
如果您希望数据采用 XML 格式,请使用 XmlSerializer。
编辑:出于某种原因,我因为 XmlSerializer 无法序列化字典而被否决。
要解决此问题,您始终可以自定义序列化过程,例如 this
【讨论】: