不实现序列化接口?是否这个类不可序列化?如果是这样可以用 ObjectOutputStream 类中的 defaultWriteObject() 方法实现序列化,随后还可用 ObjectInputStream 类中的 defaultReadObject() 方法解除序列化。
<------ 树欲静而风不止 ------>
<------ 树欲静而风不止 ------>
解决方案 »
- 3道《软件工程》填空题(数据流程图的分层,数据字典,实施图...)
- 请问如何xml做为email的模板,发送邮件?请各位一起来讨论给个思路.谢谢!
- API 上出现 Collection<E> 和Comparator<T> 其中<>内的 E或T是什么 意思
- hibernate3中生成的DAO类,怎样自动生成自己想要的方法?
- 500分求教:国外软件源码直接修改.java中字符串汉化编译出来是乱码,试了n种方法还是不行,500分求教各位达人
- 怎么实现秒表的功能??
- 关于wait()
- getInstance一般使用来干什么的啊?
- 各位高手,,我给出了程序,和出错的信息,请指点
- 这个死循环的Exception怎么写?请大家帮忙!!!!!!!!!!
- 请教关于JPanel
- 请问一个类implements一个接口是 'is a'关系吗?
要在不同的server上复制session信息,这些信息对象的共同特点是根类是Object,没有实现序列化,我打算做一个代理类来实现对信息对象的序列化,谢谢
但这也是有前提的,那个类的这些属性必须是一般类型像int,double,string,char之类的类型就可以了。
如果有谁叫你序列化一个没有实现Serializable接口的对象,应该要问问他准备给多少钱。
兄弟,看看下面关于defaultWriterObject()的说明。叫别人试什么?能这么用吗?
只能在writeObject方法中被调用,而writeObject会检查对象是否可以序列化。
Write the non-static and non-transient fields of the current class to this stream. This may only be called from the writeObject method of the class being serialized. It will throw the NotActiveException if it is called otherwise.
“怎么将类序列化(前提:不实现序列化接口)”看清楚了?没有说明是按照JAVA序列化规范进行序列化。那么就很简单了,自己定义一个规范来序列化就可以了。比如你的类如下:
public class Point {
int x;
int y;
}
那么就这么“序列化”:
<<
Point p = ...;
ObjectOutputStream oos = new ObjectOutputStream(s);
oos.writeInt(p.x);
oos.writeInt(p.y);
>>
反序列化的时候就这样:
<<
Point pp = new Point();
p.x = ois.readInt();
p.y = ois.readInt();
>>
这只是一个简单的例子。
也许你会说,只了解一点点,但从来没有接触过,其实未必如此。RMI、Socket、JMS、EJB你总该用过一种吧,彼此为什么能够传递Java对象,当然都是对象序列化机制的功劳。
第一次使用Java的对象序列化是做XXX项目(其实我也只使用过这一次,千万别扔什么蔬菜、水果^_*),当时要求把几棵非常复杂的树(JTree)及相应的数据保存下来(就是我们常用的保存功能),以便下次运行程序时可以继续上次的操作。那时XML技术在网上非常的热,而且功能也强大,再加上树的结构本来就和XML存储数据的格式很像。作为一项对新技术比较有兴趣的我当然很想尝试一下。不过经过仔细分析,发现如果采用XML保存数据,后果真是难以想象:哪棵树的哪个节点被展开、展开到第几级、节点当前的属性是什么。真是不知该用A、B、C还是用1、2、3来表示。还好,发现了Java的对象序列化机制,问题迎刃而解,只需简单的将每棵树的根节点序列化保存到硬盘上,下次再通过反序列化后的根节点就可以轻松的构造出和原来一模一样的树来。
其实保存数据,尤其是复杂数据的保存正是对象序列化的典型应用。最近YYY项目就遇到了需要对非常复杂的数据进行存取,通过使用对象的序列化,问题同样化难为简。
对象的序列化还有另一个容易被大家忽略的功能就是对象复制(Clone),Java中通过Clone机制可以复制大部分的对象,但是众所周知,Clone有深层Clone和浅层Clone,如果你的对象非常非常复杂,假设有个100层的Collection(夸张了点),如果你想实现深层Clone,真是不敢想象,如果使用序列化,不会超过10行代码就可以解决。还有就是Swing组件,如果你有两个很象很象(或是一模一样)的比较难以构造的Swing组件,你该怎么办,也许你想到了Clone,但是偏偏Java 善(Sun)弄人,Swing组件没有提供Clone方法。别急,使用序列化,6行代码搞定, ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteOut); out.writeObject(combo); ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray()); ObjectInputStream in =new ObjectInputStream(byteIn); JComboBox comb2 = (JComboBox)in.readObject(); 如果你决得还不过瘾,那2行代码也能搞定,一行代码行不?好像不行!
虽然Java的序列化非常简单、强大,但是要用好,还有很多地方需要注意。比如曾经序列化了一个对象,可由于某种原因,该类做了一点点改动,然后重新被编译,那么这时反序列化刚才的对象,将会出现异常。你可以通过添加serialVersionUID属性来解决这个问题。如果你的类是个单态(Singleton)类,是否允许用户通过序列化机制复制该类,如果不允许你需要谨慎对待该类的实现。
Singleton允许序列化才应该谨慎对待该类的实现:
<<
public class Singelton implement Serializable {
private static final Singelton INSTANCE = new Singelton();
private Singelton() {}
public static Singleton getInstance() {return INSTANCE;}
public Object readObject() throws Exception {return INSTANCE;}
}
>>
如果session类被设计得太复杂,那只好层层挖掘,直到把所有最基本的数据都找出来。