【问题标题】:Get amount of serialized objects in stream to randomly choose one获取流中序列化对象的数量以随机选择一个
【发布时间】:2013-05-20 12:26:13
【问题描述】:

我正在尝试获取我正在序列化和反序列化的流中的序列化对象的数量。我想这样做以创建一个介于 1 和该数量之间的随机值。

这可能吗?如何做?

目前我的代码是:

Random rnd = new Random();
Stream stream = new FileStream("File.dat", FileMode.Open, FileAccess.Read, FileShare.Read);
int randomNumber = rnd.Next(1, (int)stream.Length);

但是,这不起作用,因为stream.Length 的值超过 1000,而文件中大约有 3 个序列化对象。

我正在使用BinaryFormatter 进行序列化。

编辑:我应该补充一点,序列化到文件的对象是多维数组(int [,]),并且它们存储了一个数字。第一个对象的编号为 1,第二个对象的编号为 2,以此类推。 提前致谢!

【问题讨论】:

  • 序列化对象的大小可能是可变的,因此如果不将它们全部反序列化,则无法确定有多少,除非您在第一次序列化它们时将该信息写入某处。但是,如果对象是固定大小的(例如,没有字符串),那么如果您事先知道它们的序列化大小,则可以计算出来 - 然后您可以将文件长度除以每个对象的序列化大小。跨度>
  • 我怎么能做到这一点?这是一个非常好的主意,但我不知道该怎么做。每次序列化对象时,我都在考虑将值增加 1,但是当应用程序/项目关闭并稍后再次打开时,该值应该保持不变。编辑:对象不是固定大小的。
  • 是的,不幸的是,如果对象不是固定大小的,那么您将不得不将它们全部反序列化并随机选择一个。
  • 有没有办法从文件中获取某个值?所有的对象都是多维数组(int[,]),并存储了一个特定的数字。是否可以计算一个 int[,] 在流或该特定数字中出现的次数?
  • 如果您确实知道该信息,那么理论上您应该能够做到。只要格式不变。

标签: c# serialization stream binaryformatter


【解决方案1】:

您可以从大小未知的列表中随机选择一个项目,但您必须扫描整个列表才能执行此操作。但是,您不必为了选择一项而将所有项目都保存在内存中。

见我的文章Random Selection from Large Groups,尤其是标题“如果我不知道有多少怎么办”。

【讨论】:

    猜你喜欢
    • 2021-03-17
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    相关资源
    最近更新 更多