【问题标题】:I have a Single File And need to serialize multiple objects randomly. How can I in c#?我有一个文件并且需要随机序列化多个对象。我怎么能在c#中?
【发布时间】:2010-10-23 11:46:17
【问题描述】:

我有一个文件,并且需要在创建新对象时序列化同一类的多个对象。我不能将它们存储在数组中,因为我需要在创建对象的实例时对它们进行序列化。请帮我。

【问题讨论】:

  • 随机是什么意思?
  • 我认为你需要澄清你的英语。
  • 您是否将对象保存到该“单个文件”并从中取回它们?当您说要在创建对象后立即“序列化”对象时,您的意思是要将它们保存到单个文件中吗?
  • 是的,你是对的。当它们被创建到单个文件时,我需要将它们保存。

标签: c# serialization object


【解决方案1】:

对于每个到达的对象,我们会将其转换为 Base64Encoded 字符串,并将其作为一行存储在文本文件中。因此,在这个文件中,每一行每行都有一个序列化对象。在读取时,我们将一次读取一行文件并将这个 Base64 编码的字符串反序列化到我们的对象中。简单..让我们试试代码。

http://www.codeproject.com/KB/cs/serializedeserialize.aspx?display=Print

【讨论】:

    【解决方案2】:

    您使用的是什么序列化机制? XmlSerializer 可能是一个问题,因为根节点和命名空间声明之类的东西很难处理——而且它不适合部分反序列化。 BinaryFormatter 一开始就很脆弱 - 在大多数情况下我不推荐它。

    一个选项可能是protobuf-net;这是一个二进制序列化程序(使用 Google 的“协议缓冲区”格式——高效、可移植和版本兼容)。您可以使用Serializer.SerializeWithLengthPrefix 将多个对象序列化为一个流。要反序列化相同的项目,Serializer.DeserializeItems 返回反序列化项目的 IEnumerable<T> - 或者您可以轻松地将 TryDeserializeWithLengthPrefix 设为公开(目前是私有的,但源可用)。

    只需在创建每个对象后将其写入文件 - 工作完成。

    如果您想要一个示例,请说 - 尽管单元测试 here 给出了概述。

    基本上类似于(未经测试):

    using(Stream s = File.Create(path))
    {
        Serializer.SerializeWithLengthPrefix(s, command1, PrefixStyle.Base128, 0);
        ... your code etc
        Serializer.SerializeWithLengthPrefix(s, commandN, PrefixStyle.Base128, 0);
    }
    ...
    using(Stream s = File.OpenRead(path)) {
        foreach(Command command in
               Serializer.DeserializeItems<Command>(s, PrefixStyle.Base128, 0))
        {
           ... do something with command
        }
    }
    

    【讨论】:

    • 我知道我参加聚会迟到了,但你介意在 BinaryFormatter is very brittle to begin with - I don't recommend it in most cases. 上详细说明它为什么会变脆?你为什么不推荐它?这个答案已经有一段时间了,也许您可​​以推荐另一种将多个对象序列化为单个文件/多个文件的方法?
    • @mehow 确定:BinaryFormatter 非常不容忍版本/重构:很容易导致它在更改时无法反序列化现有文件......好吧,坦率地说。它还依赖于框架和平台,限制了选项。它也不必要地臃肿和低效,并且有许多“陷阱”。至于你的另一个问题:我有偏见,但我想说 protobuf-net 解决了所有这些问题。毕竟,这是设计目标 :) protobuf-net 对流中的多个对象非常满意,只要使用 *WithLengthPrefix 方法。
    • 直接来自code.google.com/p/protobuf-net:“.proto 序列化格式归功于 Google 的独创性。这个特定的 .NET 实现由 Stack Exchange / Stack Overflow 的开发人员 Marc Gravell 设计和编写。”。 ..如果您开发了它,那么我认为您的意见是“主观的”而不是“客观的”
    • @lauCosma 那要看什么意见了;我经常和例行地使用多种序列化格式,并且知道许多格式和(单独的)库的大部分限制和目标场景。我想说,这种亲身体验使我有资格对每种方法的优缺点做出一些“客观”的陈述。但是,我在这篇文章中找不到任何提到“主观”或“客观”的地方,所以很难知道您指的是什么具体
    【解决方案3】:

    查看答案here

    简而言之,只需将所有内容序列化到同一个文件流,然后反序列化。 dotNet 会知道每个对象的大小

    【讨论】:

      猜你喜欢
      • 2016-12-20
      • 1970-01-01
      • 2011-01-07
      • 2016-08-16
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多