Chinaunix首页 | 论坛 | 博客
  • 博客访问: 715083
  • 博文数量: 147
  • 博客积分: 6010
  • 博客等级: 准将
  • 技术积分: 1725
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-22 10:36
文章分类

全部博文(147)

文章存档

2011年(1)

2010年(1)

2009年(35)

2008年(110)

我的朋友

分类: Java

2008-12-09 18:44:02

所谓对象序列化就是将对象的状态转换成字节流,以后可以通过这些值再生成相同状态的对象!
   对象序列化是对象持久化的一种实现方法,它是将一个对象的属性和方法转化为一种序列化的格式以用于存储和传输,反序列化就是根据这些保存的信息重建对象的过程。
java对象序列化机制一般来讲有两种用途:
1.需要将对象的状态保存到文件中(存储),而后能够通过读入对象状态来重新构造对象,恢复程序状态
2.使用套接字在网络上传送对象的程序来说,是很有用的(传输)。
  我们通过让类实现java.io.Serializable 接口可以将类序列化。这个接口是一个制造者(marker)接口。也就是说,对于要实现它的类来说,该接口不需要实现任何方法。它主要用来通知Java虚拟机(JVM),需要将一个对象序列化。
  对于这个,有几点我们需要明确:
1.并非所有类都可以序列化,在cmd下,我们输入serialver java.net.socket,可以得到socket是否可序列化的信息,实际上socket是不可序列化的。
2.java有很多基础类已经实现了serializable接口,比如string,vector等。但是比如hashtable就没有实现serializable接口。
  将对象读出或者写入流的主要类有两个: ObjectOutputStream与ObjectInputStream 。ObjectOutputStream 提供用来将对象写入输出流的writeObject方法, ObjectInputStream提供从输入流中读出对象的readObject方法。使用这些方法的对象必须已经被序列化的。也就是说,必须已经实现Serializable接口。如果你想writeobject一个hashtable对象,那么,会得到一个异常
举个例子:
 

class Student implements Serializable
{
    public String name;
    public int age;
    public Student()
    {
        
    }
    public Student(String name,int age)
    {
        this.name = name;
        this.age = age;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
}
public class test
{
    
    public static void main(String[] args)
    {
        // TODO 自动生成方法存根

        Student stu1 = new Student("phinecos",20);
        Student stu2 = null;
        try
        {
            ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("c:\\a.data"));
            out.writeObject(stu1);
            out.flush();
            out.close();
            

        }
        catch(Exception ex)
        {
            System.err.println(ex.getMessage().toString());
        }
        try
        {
              ObjectInputStream in = new ObjectInputStream( new FileInputStream("c:\\a.data"));
              stu2 = (Student) in.readObject();
              in.close();
        }
        catch (Exception e)
        {
            stu2 = new Student();
        }
            System.out.println( "Original data: " + stu2.getName()+" "+stu2.getAge() );        
    }
}

举个实际应用的例子:

为了实现系统交互的目的,我们需要系统之间通过网络传输对象的实体(这些对象一般都是包括了系统中的一些数据),
Java序列化是一种解决方案:
系统A和B之间要进行交互,则A中的对象a首先会序列化,然后通过网络传输到系统B,在B中经反序列化还原,然后对其进行操作,利用对象a所提供的数据。但要实现这种方案对原来的系统有如下的要求:
    交互的系统之间要存在完全一致的对象模型,这就需要对原来的系统进行比较大的改变,不符合我们的要求。
    因为序列化传输的数据是二进制格式的,除非把这些二进制的数据反序列化为对象,否则我们根本不能对其数据进行处理,也不能看到里面包含的数据是什么。
    要求交互的系统都是基于Java的,因为Java序列化只
能应用与Java系统之中。
XML数据绑定实现:
用XML和XML的数据绑定可以有效的解决项目中存在的问题,系统A中的对象被整理成XML格式的数据,XML经过网络传输到系统B。这样B所面对的是一个包含了有效数据的XML文档,它可以根据需要对此文档进行处理。一方面可以利用反转把此文档还原为自己的对象模型,另外还可以利用XSLT把此XML数据转换为合适的格式进行处理或者显示。由此可以看出,这种实现方案比Java序列化的方法有着更大的灵活性和优势,它解决了原有方案所存在的许多问题:
   利用XML作为数据传输的载体,在各个应用之间传递数据。因为XML是基于纯文本的,所以可以方便的被人读懂和修改,并且它可以不受防火墙的限制,方便在系统之间进行传输。
  它避免对原有系统的侵入,最大程度上利用它们原来的对象模型来处理数据,我们利用XML数据绑定把接收到的数据绑定为系统原来的对象模型,以方便对数据的处理。并且在必要的时候可以用XSLT对XML数据进行转化,以符合我们的需要。
  从本质上讲,XML数据绑定实际上是一种处理XML数据的方式,它是与具体的实现平台独立的,可以方便对用于不同技术实现的系统进行整合。

    DOM和SAX是比较常用的操作XML数据的API。DOM提供了一个自然的、面向对象的机制来遍历构成XML文档并可以检索信息树的节点,但它把整个文档解析为树状结构,并将其全部放入内存。对于较大的文档来说,效率较低。而SAX是基于事件处理模式的,速度快,但不能对文档对象进行随机的存取。但是DOM和SAX只适合于较低层次的XML操作,它们处理的XML文档的结构。但对于大多数需要处理XML数据的应用而言,这些API显得力不从心,并且他们没有提供任何描述数据含
义的方法。
Castor是关于Java的一个开源的项目,用Java语言来编写,并执行Java语言的数据绑定服务。下一节将Castor的使用(xml数据绑定)

 

阅读(6261) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~