不实现序列化接口?是否这个类不可序列化?如果是这样可以用 ObjectOutputStream 类中的 defaultWriteObject() 方法实现序列化,随后还可用 ObjectInputStream 类中的 defaultReadObject() 方法解除序列化。
<------ 树欲静而风不止 ------>

解决方案 »

  1.   

    项目需要
    要在不同的server上复制session信息,这些信息对象的共同特点是根类是Object,没有实现序列化,我打算做一个代理类来实现对信息对象的序列化,谢谢
      

  2.   

    给你都说了,自己的类继承自Object而不能序列化,defaultWriteObject() 方法可以,你不试试?<------ 树欲静而风不止 ------>
      

  3.   

    不实现序列化接口来实现序列化????我想你只要自己写个把你那个类的属性成员的值都保存到文件里的方法和一个把那些你保存到文件中的值重新赋给那个类的相应属性的方法就可以了。
    但这也是有前提的,那个类的这些属性必须是一般类型像int,double,string,char之类的类型就可以了。
      

  4.   

    这位兄弟的想法有建设性,不妨试着自己从新搞一套java标准出来好了,中国制造的。到时侯兄弟们都 学你的java好了。
      

  5.   

    呵呵,都知道序列化一个对象的话,该对象必须实现Serializable接口。
    如果有谁叫你序列化一个没有实现Serializable接口的对象,应该要问问他准备给多少钱。
      

  6.   

    TO mq612(理想):
    兄弟,看看下面关于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.
      

  7.   

    楼主的要求其实也不是不可以做到,大家看看他提的问题:
    “怎么将类序列化(前提:不实现序列化接口)”看清楚了?没有说明是按照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();
    >>
    这只是一个简单的例子。
      

  8.   

    呵呵,你厉害,不过你可以看一下序列化类的源码,去src.zip找,找不到就反编译,然后再看一个具体的实现类,比如HashMap类,看看他们具体怎么实现的,把代码拷贝修改,一切OK.
      

  9.   

    网上看的一片文章,不知道对你是否有所帮助:所谓对象序列化就是将对象的状态转换成字节流,以后可以通过这些值再生成相同状态的对象。这个过程也可以通过网络实现,可以先在Windows机器上创建一个对象,对其序列化,然后通过网络发给一台Unix机器,然后在那里准确无误地重新“装配”。是不是很神奇。 
    也许你会说,只了解一点点,但从来没有接触过,其实未必如此。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)类,是否允许用户通过序列化机制复制该类,如果不允许你需要谨慎对待该类的实现。
      

  10.   

    可惜,楼上那么大一篇文章好像对楼主的问题没有什么用处。
    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;}
    }
    >>
      

  11.   

    潘爱民翻译的<Effective Java>中文版对解决这个也许会有一点帮助
      

  12.   

    把session中的信息从保存它的类里挖掘出来,然后用新类包装。
    如果session类被设计得太复杂,那只好层层挖掘,直到把所有最基本的数据都找出来。