问一个 序列化 的问题

HeavensDoor 2011-04-15 04:46:21
我想把我自定义的类的对象进行持久化,现采用BinaryFormatter来进行序列化和反序列化。
如我类结构为
class TestObject
{
ArrayList list=new ArrayList();
}

类中有一个ArrayList类型的对象。

现在问题是,比如当我用过一段时候后,发现需要把list 的类型从ArrayList改为List<int>。
class TestObject
{
List<int> list=new List<int>();
}

但当我改完之后,对之前序列化的对象进行反序列化时,就会报异常,因为对象名没有改变,原来的ArrayList无法反序列化!
可我又不想把原来list里的数据丢掉!
请问怎么才能把原来list里的数据 转到 现在的list中????
急求!!

...全文
73 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
HeavensDoor 2011-04-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 vrhero 的回复:]
那你必须修改类定义,增加OnDeserializedAttribute、OnDeserializingAttribute、OnSerializedAttribute和OnSerializingAttribute方法并实现自定义序列化和反序列化...看看MSDN吧...
[/Quote]
这些方法我都已经试过,解决不了我现在的问题,它们能解决的应该是那种 反序列化回来赋个初值啊等等,但我的问题是代码结构的问题,简单点说代码都执行不到这里就异常了!

可能真得像8楼说的,保留原来的类做过滤类,修改代码就只能再定义新类,不过这样要背的包袱好像好大啊?而且感觉很脆弱的样子?!
机器人 2011-04-15
  • 打赏
  • 举报
回复
同意vrhero的意见。

直接反序列化没办法,你可以定义过渡类,自己将ArrayList拷贝至List<int>。
BinraryFormater 是按照 ArrayList 类的格式序列化的,也就是内存里的布局。
这和List<int>肯定是不一样的。

PS:如果是xml格式的序列化,还有可能。。。
vrhero 2011-04-15
  • 打赏
  • 举报
回复
那你必须修改类定义,增加OnDeserializedAttribute、OnDeserializingAttribute、OnSerializedAttribute和OnSerializingAttribute方法并实现自定义序列化和反序列化...看看MSDN吧...
HeavensDoor 2011-04-15
  • 打赏
  • 举报
回复
不好意思,我没说有清楚,我只的Geometry其实是我自定义的一个类,真正名叫doGeometry,里面的结构不只是点阵,里面又包含了很多的自定义类,如自定义样式,空间结构等等。

如果采用XML方式来保存,那这个XML结构会非常复杂,所以还不想这样考虑。

关于你说的转换,我觉得你还是没有理解我的意思,或者说你应该不是太了解序列化。

我已经说了,我之前保存了一些对象,是用序列化的方式写成二进制流保存到文本文件里的,
而我现在还需要使用之前的这些对象,那我要打开这个对象,我肯定先要把这个二进制反序列化到内存成为一个类的实例,然后才能操作。而我现在的代码已经是List<int>了,所以我在反序列化一个ArrayList对象肯定就会异常!!
vrhero 2011-04-15
  • 打赏
  • 举报
回复
Geometry其实只是一些点阵而已...你参考一下WPF中Geometry的XAML定义就知道如何用XML表示了...

ArrayList转换List<int>很简单...只要确保ArrayList中的元素都是int就行...
List<int> list = new List<int>((int[])arraylist.ToArray(typeof(int)));
HeavensDoor 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 vrhero 的回复:]
谁让你二进制序列化来的,全部按ArrayList读出转换后再全部重写进去...
[/Quote]

1. 那请问我该怎么把一个类对象持久化呢?
比如一个Geometry几何对象类

2. 我是序列化保存的,那你的意思是说,我先要把代码改成ArrayList,然后对所有保存的对象都执行一遍反序列化,把对象读到内存,那请问我接下来该怎么重写成List<int>呢????
vrhero 2011-04-15
  • 打赏
  • 举报
回复
谁让你二进制序列化来的,全部按ArrayList读出转换后再全部重写进去...
HeavensDoor 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 msdnxgh 的回复:]
再从新转换一个?
[/Quote]

没懂!
MSDNXGH 2011-04-15
  • 打赏
  • 举报
回复
再从新转换一个?

110,571

社区成员

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

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

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