序列化之陷阱

序列化方法为数据的持久化保存提供了非常方便的解决方法,但是如果你不小心,就会陷入其中的陷阱。下面将我的经验记下。一次我在写电网拓扑程序中,电网对象的成员有节点集和连线集,两个集合中都是用列表来保存,在节点列表中,每个节点对象有一个连线列表的成员,记录了与该节点连接的连线,每条线中有一个两个节点元素的列表,记录了该连线的两个节点。这样就建立了电网的逻辑拓扑关系。但是当我在保存电网数据时,将线和节点两个列表分开序列化保存,当我再一次调入两个列表的数据,把他们放进一个电网中时,电网设备都可以正常显示,但是奇怪的是拓扑关系却没有了,追综检查,节点的连线在,连线的两个节点也在,可是就是连接不上。思考了许久,终于明白了其中的缘由。

    原来问题出在了将点线分开序列化了。点的序列化时,要序列化所有的成员,包括引用传递的成员,就将点的连线集合也序列化了,也就是说,表面上之序列化点,实际上与点联系的线也被一起序列化了。在线的序列化时同样如此。这样实际上是保存了两套电网数据。当反序列化恢复电网的点和线时,他们实际上是相互分割的两套电网,自然就没有了拓扑关系,虽然表面上能够合在一起,几何上是相连的,但是已经没有拓扑了。

    其实序列化就是相当于对象的复制,包括隐含的对象。而内存中建立的拓扑就不存在了。

   那没当然,直接将电网对象整体序列化,问题迎刃而解。经验之:一般对象不要将成员分开序列化,特别是成员之间互相联系时,你中有我,我中有你时特别如此。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值