序列化将两个数组分次保存进一个文件。读取出问题。希望高手解答。

qjf9013 2010-01-06 01:05:48
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.IO;


namespace _1._6test
{
class Program
{
static void Main(string[] args)
{
ArrayList l = new ArrayList();
for (int x = 1; x < 5; x++)
{
Console.WriteLine(x);
l.Add(x);
}
Stream s = File.Open("11.bin", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
BinaryFormatter b = new BinaryFormatter();
b.Serialize(s, l);
s.Close();
ArrayList k = new ArrayList();
for (int x = 6; x < 10; x++)
{
Console.WriteLine(x);
k.Add(x);
}
b = new BinaryFormatter();
Stream s1 = File.Open("11.bin", FileMode.Append);
b.Serialize(s1, k);
s1.Close();
Console.Write("正在从磁盘反序列化对象图..");
Stream r = File.Open("11.bin", FileMode.Open, FileAccess.Read);
BinaryFormatter c = new BinaryFormatter();
ArrayList p = (ArrayList)c.Deserialize(r);
Console.WriteLine("完成。");
foreach (int i in p)
{
Console.WriteLine(i);
}
r.Close();
Console.WriteLine("\r\n按任意键退出。");
Console.Read();

}
}
}
以上代码。 但是读取的时候,只能读出1 2 3 4 第二个数组,也就是后加到文件里的数组怎么读出来?谢谢请解答。
问题2:我是刚刚才工作。现在处在学习阶段,老大让我突破二进制序列化的大小限制。 怎么办。15038549 QQ
...全文
410 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
程静涛 2010-12-03
  • 打赏
  • 举报
回复
mark一下,表示学习中,正在尝试从序列化的list中获取指定的某一项,表示未成功。。。。。
不过主要问题就在position上。恩。
aimeast 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 jimh 的回复:]
各人机器配置不同,关键是内存,磁盘空间也有关系,如果int类型1亿的长度,那大概是1亿×4(int=4byte)=400M的内存空间,如果是两个数组,那就是800M了,一般老一点的机器都跑不动,出错是难免的了。
[/Quote]
我的机器也非常老了,也没有问题。
估计是lz的机器更老了。

ms的库,特别是这些系统库,是经过非常严格的测试的,官方没说有限制,那肯定是你的用法有问题。
qjf9013 2010-01-07
  • 打赏
  • 举报
回复
再顶啊 牛人快快出现
huohuli008 2010-01-06
  • 打赏
  • 举报
回复
ding yige
qjf9013 2010-01-06
  • 打赏
  • 举报
回复
继续顶啊 问题还没 解决 拆分 类 太麻烦了 有没有更好的思路
qjf9013 2010-01-06
  • 打赏
  • 举报
回复
顶上去
qjf9013 2010-01-06
  • 打赏
  • 举报
回复
怎么办 谁对定制Formatter类有研究
jimh 2010-01-06
  • 打赏
  • 举报
回复
各人机器配置不同,关键是内存,磁盘空间也有关系,如果int类型1亿的长度,那大概是1亿×4(int=4byte)=400M的内存空间,如果是两个数组,那就是800M了,一般老一点的机器都跑不动,出错是难免的了。
aimeast 2010-01-06
  • 打赏
  • 举报
回复
这个代码就没有问题啊。
生成文件大小将近400M
[code=c#] List<int> list = new List<int>(100000000);
for(int i = 0;i < list.Capacity;i++)
list.Add(i);

using(FileStream fs = new FileStream("1.bin", FileMode.Create, FileAccess.Write))
{
BinaryFormatter f = new BinaryFormatter();
f.Serialize(fs, list);
fs.Flush();
}
list = null;
using(FileStream fs = new FileStream("1.bin", FileMode.Open , FileAccess.Read ))
{
BinaryFormatter f = new BinaryFormatter();
list = f.Deserialize(fs) as List<int>;
}[/code]
qjf9013 2010-01-06
  • 打赏
  • 举报
回复
也谢谢楼上两位。 数据量过大的情况有多种。 但是一个类中包含各种各样的字段 属性等等,分解起来相当麻烦。我现在正在重新定制自定义序列化 如果能够通过就把代码贴上来大家一起分享。这帖子明晚结,继续讨论。
LutzMark 2010-01-06
  • 打赏
  • 举报
回复
需要用到long型了
x4 = new long[long.MaxValue];
LionFlying 2010-01-06
  • 打赏
  • 举报
回复
学习啊!
元宇宙之家 2010-01-06
  • 打赏
  • 举报
回复
数据量过大就拆成小数组序列化进去、再序列化出来。
元宇宙之家 2010-01-06
  • 打赏
  • 举报
回复
ArrayList p1 = (ArrayList)c.Deserialize(r);
ArrayList p2 = (ArrayList)c.Deserialize(r);
Console.WriteLine("完成。");
进去两个ArrayList,你只读取了一个。p1含1-4。p2含6-9。
qjf9013 2010-01-06
  • 打赏
  • 举报
回复
同意的方法 我也在试着把类递归分解成若干个种变量。哈哈。 加我QQ啊 15038549 交个朋友哈。 这么热心肠好难找啊。。- -
tommir3 2010-01-06
  • 打赏
  • 举报
回复
序列化,你那个例子是对类操作,类中有大数组.....
这样分割数组就随队类中的数组进行分割,然后再对分割后的若干个类进行操作,
感觉写死了....不过不知道怎么方便它了。

你的问题也可以解决(还是思路-_-!)
1,每次序列化A类前都先序列化一段自定义标记类,成员就3个,
string _startFlag; //标记的开始
int _splitLen; //分割的大小
string _endFlag; //标记的结束
2、怎么序列化,就相应的怎么反序列化,虽然是类,其实只是类中数组的操作,
你把数组合并后再添加到A类中,不就还原了。

这些差不多就是生成自己定义的文件,或者说自己定义的文件格式,你自己的规范。
qjf9013 2010-01-06
  • 打赏
  • 举报
回复
输入流是无效的二进制格式
出现的错误是这个。 应该在序列化的过程就已经出错,而不是反序列化的过程。

楼上的兄弟。你那个方法我也在试。遇到的问题如下:
1、标记的问题,怎么办。不了解。 在流前写入字节? 如果和二进制的一样了怎么办。
2、读取的问题,不知道咋办。

我很赞同楼上兄弟的想法,数据量太大必须分次。希望楼下多提意见 呵呵
tommir3 2010-01-06
  • 打赏
  • 举报
回复
....这两个一亿,生成的文件就762M.....
恩,和你说的一样,我还没做,先说下思路。
在序列化时,你就分批序列化,例如,每次序列化的大小定为1024,然后把你要序列化的文件(前提为相同类型,现为数组)分成若干份1024的大小,分别进行序列化。
在反序列化时,你再分别反序列化出来后,再合并成一个数组。
现在又有一个问题,就是这个文件被分成了多少份的问题?
你可以在文件中加一段标记,例如前面说的标记 &//序列化数组的长度&
知道找到 &&之间的大小,就按这个大小反序列化。
我的思路,并没实现,希望多多批评指教。
qjf9013 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 tommir3 的回复:]
回你13楼的问题,试过了,序列化,反序列化,没问题,
1亿的数组可能读出来,不知道你的问题是不是这样?
[/Quote]
你把X6 = new int[一亿] 同样设置成一亿 加上X4也是一亿 我这就读取出错了,也就是提示反序列化的时候出错。但是我觉得应该是序列化的时候就已经错了。
tommir3 2010-01-06
  • 打赏
  • 举报
回复
回你13楼的问题,试过了,序列化,反序列化,没问题,
1亿的数组可能读出来,不知道你的问题是不是这样?
加载更多回复(20)

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧