【问题标题】:Saving Data Structures in C#在 C# 中保存数据结构
【发布时间】:2008-12-16 07:08:47
【问题描述】:

我正在通过编写一个家庭图书馆管理器来学习 C#。

我有一个 BookController,它将书籍存储在数据结构中并对它们执行操作。

C# 是否有办法将字典中的数据保存到本地文件,可能以 XML 方式稍后加载,还是我必须自己编写?

在 C# 中保存和加载这些数据的最佳方法是什么?只需要指出一个好的方向。

【问题讨论】:

    标签: c# serialization


    【解决方案1】:

    实际上,C#(语言)对序列化一无所知,但 .NET(框架)提供了很多方法...XmlSerializerBinaryFormatterDataContractSerializer (.NET 3.0) - 或者也有一些定制的序列化框架。

    使用哪个取决于您的要求; BinaryFormatter 使用简单,但会将程序集元数据信息刻录到文件中 - 使其不可移植(例如,您无法在 Java 中打开它)。 XmlSerializerDataContractSerializer 主要是基于 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);
            }
    

    【讨论】:

      【解决方案2】:

      看看SerializationISerializable interface

      它允许您以可移植的形式保存对象的状态。

      【讨论】:

        【解决方案3】:

        您还应该考虑使用 Linq to SQL(或实体框架)进行 O/R 映射并将数据存储到数据库(SQL CE、SQL Express)中。

        【讨论】:

          【解决方案4】:

          我创建了一个扩展方法,它接受一个对象并为您创建一个 xml 字符串,您需要做的就是从文件中保存/加载。 XmlSerialisation

          【讨论】:

            【解决方案5】:

            如果您希望数据采用 XML 格式,请使用 XmlSerializer

            编辑:出于某种原因,我因为 XmlSerializer 无法序列化字典而被否决。

            要解决此问题,您始终可以自定义序列化过程,例如 this

            【讨论】:

            • XmlSerializer 无法序列化 Dictionary
            • 谁说这是@Coyote 使用的?无需投票,答案没有。可能不完整,但一个提示就足够了。如果你碰壁了,有办法用 XML 序列化字典。
            • 我将字典视为不需要在数据中公开的内部查找优化。即,如果您的字典键是对象中的一个属性,那么您只是通过将有效负载放在那里两次并拥有额外的包装器代码来膨胀有效负载。 IMO 序列化字典是懒惰的拖放编码器实践。
            猜你喜欢
            • 2012-03-28
            • 1970-01-01
            • 2013-10-29
            • 1970-01-01
            • 2010-12-01
            • 1970-01-01
            • 2021-03-04
            • 2021-11-20
            • 2022-01-03
            相关资源
            最近更新 更多