黑马程序员技术交流社区

标题: 对于一个普通的类对象,如何在TreeSet集合中完成排序操作? [打印本页]

作者: 于汝国    时间: 2011-12-21 14:09
标题: 对于一个普通的类对象,如何在TreeSet集合中完成排序操作?
本帖最后由 于汝国 于 2011-12-22 12:44 编辑

TreeSet的内容是允许进行排序的,但是对于一个普通的类对象是不能向TreeSet集合中加入的,那么、如何在TreeSet集合中实现对普通类对象的排序操作呢?
作者: 海中的游弋草    时间: 2011-12-21 14:10
使用java以来,序列化随处可见,至于为什么要用序列化、序列化能解决什么问题,作为一个普通的码农,一般不怎么会去深入研究,由于最近在看mina和公司内部涉及到nio框架的一些源码,里面涉及到hession、java这两种序列化,至于hession序列化为什么会诞生以及在apache项目中使用如此广泛,以及java本身序列化存在哪些缺陷,甚是不解,为了解答上面抛出来的疑惑,以及进一步了解java的序列化机制,这里开个小头,从java的序列化接口Serializable开始说起

  jdk包里的Serializable接口的注释主要说明了以下几点:

  1.类通过实现Serializable接口来启用序列化,否则该类的任何状态将无法被序列化,同时也无法用于反序列化

  2.若继承的父类没有实现Serializable接口,但是又想让子类可序列化,有三个注意事项:

  a)。子类实现Serializable接口

  b)。子类必须有可访问的无参构造方法,用于保存和恢复父类的public或protected或同包下的package字段的状态,否则在序列化或反序列化时会抛出RuntimeException异常

  c)。对于序列化后的子类,在进行反序列化时,理论上无法初始化父类中private(不可访问)对象变量的状态或值

  3.在对可序列化类中的属性进行序列化时,如果遇到不可序列化的对象变量,此时会针对不可序列化的类抛出NotSerializableException异常

  4.对于可序列化的非数组类,强烈建议显示声明static型、long型、final型serialVersionUID字段用于标识当前序列化类的版本号,否则在跨操作系统、跨编译器之间进行序列化和反序列化时容易出现InvalidClassException异常

  5.对于可序列化类中的static、transient对象变量,在序列化时无法保存其状态或值,static对象变量在反序列化时取得的值为当前jvm中对应类中对应static变量的值,而transient(瞬态)关键字则一般用于标识那些在序列化时不需要传递的状态变量

  简单的测试代码:

  01 import java.io.FileInputStream;02 import java.io.FileNotFoundException;03 import java.io.FileOutputStream;04 import java.io.IOException;05 import java.io.ObjectInputStream;06 import java.io.ObjectOutputStream;07 import java.io.Serializable;08

  09 /** 10 * 序列化测试11 * 12 * @author sume 13 * 14 */ 15 public class SerializableImpl implements Serializable { 16

  17 private static final long serialVersionUID = -6433786313435044319L;18

  19 static String staticVal = "static1";20 transient String transientVal = "transient1";21 String val = "val1";22

  23 /** 24 * main 25 */ 26 public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException { 27 // 序列化28 SerializableImpl sila1 = new SerializableImpl();29 ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("Serializable.txt"));30 objectOutputStream.writeObject(sila1);31 objectOutputStream.close();32

  33 // 反序列化34 SerializableImpl.staticVal = "static2";35 ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("Serializable.txt"));36 SerializableImpl sila2 = (SerializableImpl) objectInputStream.readObject();37 objectInputStream.close();38

  39 // 比较各个属性的值40 System.out.println(sila2.staticVal);41 System.out.println(sila2.transientVal);42 System.out.println(sila2.val);43 } 44 }输出结果:1 static2 2 null 3 val1从输出结果可以看出:

  1.反序列化后类中static型变量staticVal的值为当前jvm中对应static变量的值,为:static2,而不是序列化时的值:static1

  2.transient关键字标识的变量的状态并没有在序列化中被保存,因此反序列化后

  transientVal变量的值为null

  3.第三个为常见的对象状态在序列化和反序列化过程中的传递


作者: 六期刘健    时间: 2011-12-21 14:11
对象实例化后可以用里面的方法等等!!!!比如说有一个abc的累他里面有一个方法c,你可以 abc a = new abc();  a.c();我不知道你想知道的是不是这个
作者: 于汝国    时间: 2011-12-21 14:12
非常谢谢您的解答!要是能简明扼要就好了!
作者: 舒远    时间: 2011-12-21 14:23
本帖最后由 舒远 于 2011-12-21 14:28 编辑

对象序列化,通俗来讲就是将对象在内存的二进制数据以流的形式保存到磁盘等永久存储设备上。
想要实现序列化的对象,它所属的类必须implements serializable接口。该接口没有提供任何方法。他是个标记接口表名实现该接口的类的对象可以序列化。
我们使用IO流体系中的ObjectInputStream和ObjectOutputStream两个类来完成对象序列化的过程。
调用它们的readObject和writeObject方法来完成将对象写到文件中和从文件中将对象反序列化到内存中的操作。和操作普通流对象差不多。
作者: 郭繁森    时间: 2011-12-21 15:36
序列化的实现

将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

例子:

import java.io.*;

public class Test
{
public static void main(String[] args)

后面代码请链接:
http://developer.51cto.com/art/200510/6942.htm
作者: 郭繁森    时间: 2011-12-21 15:38
序列化的实现

将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

例子:

import java.io.*;

public class Test
{
public static void main(String[] args)

后面代码请链接:
http://developer.51cto.com/art/200510/6942.htm

拓展(我们论坛的):http://bbs.itheima.com/forum.php?mod=viewthread&tid=2111




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2