Java 之 序列化接口

一、java.io.Serializable 接口

  类通过实现 java.io.Serializable 接口以启用其序列化功能,未实现此接口的类型将无法使其任何状态序列化或反序列化。

  可序列化类的所有子类型本身都是可序列化的。

  序列化接口没有方法或字段,仅用于标识可序列化的语义。

  如果实现 Serializable 接口,对象如何序列化,各个属性序列化的顺序是什么,都是默认的,程序员本身无法指定,也不用关心。

  如果属性前面有  static 和 transient 修饰,该属性不参与序列化。

二、java.io.Externalizable 接口

  若某个要完全控制某一对象及其超类型的流格式和内容,则它要实现 Externalizable 接口中的 writeExternal 和 readExternal 方法。

  程序员要在 writerExternal 方法中,自己定制哪些属性要序列化,顺序是什么样的。

  程序员要在 readExternal 方法中,自己定制哪些属性要反序列化,顺序与 writerExternal 方法中的一致。

  Demo:JavaBean 类

 1 import java.io.Externalizable;
 2 import java.io.IOException;
 3 import java.io.ObjectInput;
 4 import java.io.ObjectOutput;
 5
 6 public class Goods implements Externalizable{
 7     private static String brand = "Made In China";
 8     private String name;
 9     private double price;
10     private transient int sale;
11     public Goods(String name, double price, int sale) {
12         super();
13         this.name = name;
14         this.price = price;
15         this.sale = sale;
16     }
17     public Goods() {
18         super();
19     }
20     public static String getBrand() {
21         return brand;
22     }
23     public static void setBrand(String brand) {
24         Goods.brand = brand;
25     }
26     public String getName() {
27         return name;
28     }
29     public void setName(String name) {
30         this.name = name;
31     }
32     public double getPrice() {
33         return price;
34     }
35     public void setPrice(double price) {
36         this.price = price;
37     }
38     public int getSale() {
39         return sale;
40     }
41     public void setSale(int sale) {
42         this.sale = sale;
43     }
44     @Override
45     public String toString() {
46         return "Goods [brand = " + brand +",name=" + name + ", price=" + price + ",sale = " + sale +"]";
47     }
48     @Override
49     public void writeExternal(ObjectOutput out) throws IOException {
50         //程序员自己定制要序列化的内容,顺序等
51         //这两个方法是在对象被序列化和反序列化的过程中,JVM帮我们调用
52         out.writeUTF(brand);//静态的也序列化
53         out.writeUTF(name);
54         out.writeDouble(price);
55         out.writeInt(sale);//有transient也序列化
56     }
57     @Override
58     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
59         //程序员自己定制要反序列化的内容,顺序等,建议与序列化的顺序一致
60         brand = in.readUTF();
61         name = in.readUTF();
62         price = in.readDouble();
63         sale = in.readInt();
64     }
65
66 }

  序列化与反序列

 1 import java.io.FileInputStream;
 2 import java.io.FileOutputStream;
 3 import java.io.IOException;
 4 import java.io.ObjectInputStream;
 5 import java.io.ObjectOutputStream;
 6 import org.junit.Test;
 7
 8 public class TestObject {
 9     @Test
10     public void test01() throws IOException{
11         Goods goods = new Goods("《Java从入门到放弃》", 20.45, 100);
12         Goods.setBrand("China Beijing");
13
14         FileOutputStream fos = new FileOutputStream("goods.dat");
15         ObjectOutputStream oos = new ObjectOutputStream(fos);
16
17         oos.writeObject(goods);
18
19         oos.close();
20         fos.close();
21     }
22
23     @Test
24     public void test02()throws IOException, ClassNotFoundException{
25         FileInputStream fis = new FileInputStream("goods.dat");
26         ObjectInputStream ois = new ObjectInputStream(fis);
27
28         Object obj = ois.readObject();
29         System.out.println(obj);
30
31         ois.close();
32         fis.close();
33     }
34 }

原文地址:https://www.cnblogs.com/niujifei/p/12244812.html

时间: 2024-10-11 03:42:24

Java 之 序列化接口的相关文章

android ipc通信机制之二序列化接口和Binder

IPC的一些基本概念,Serializable接口,Parcelable接口,已经Binder.此核心为最后的IBookManager.java类!!! Serializable接口,Parcelable接口都是可以完成对象的序列化过程. 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象. 两者均可以实现序列化并且都可以用于Intent数

Java序列化接口Serializable接口的作用总结

转载 http://www.cnblogs.com/DreamDrive/p/4005966.html 一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做"持久化". 把堆内存中的对象的生命周期延长,存入硬盘,做持久化操作.当下次再需要这个对象的时候,我们不用new了,直接从硬盘中读取就可以了.(存储到硬盘是一个文件,不需要我们去解析,如果用记事本打开解析会出现乱码,解析要用特定的方式,不用我们管. 我们只需要读取). 把对象存储到硬盘上的一个文件中,这个文件的标准扩展名是(.

java序列化接口Serializable的使用

来自:http://wang09si.blog.163.com/blog/static/170171804201373195046397/ 首先要明白,什么是序列化?我们经常看到一个实体类实现Serializable接口,这种用法就是序列化.目的是保存对象的状态,以便将它读取出来.序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得.序列化将数据分解成字节流,以便存储在文件中或在网络上传输.反序列化就是打开字节流并重构对象.对象序列化不仅要将基本数据类型转换成字节表示,有时还

Java对象序列化原理以及Serializable接口

Java对象的序列化就是把一个对象变成二进制的数据流的一中方法,通过对象的序列化可以方便的实现对象的传输和存储. 原理是:对象------------->转换----------------->将对象转变为二进制的数据 在对象序列化时,只有其属性被序列化(每个对象都具备相同的方法,但是每个对象的属性不一定相同,也就是说对象保存的只有其属性信息) 那么一个类的对象要被序列化,这该类就必须实现java.io.Serializable接口,其源码如下: public interface Serial

Java 的序列化Serializable接口介绍及应用

常看到类中有一串很长的 如 private static final long serialVersionUID = -4667619549931154146L;的数字声明.这些其实是对此类进行序列化的,那为何要进行序列化呢?下面参照网络及jdk说明,进行学习一下: 理解: serialVersionUID 用来表明类的不同版本间的兼容性 简单的说,Java的序列化是通过在运行时判断类的serialversionUID来验证版本的一致性的.在进行序列化时,jvm会把传来的字节流中的serialv

使用Serializable接口进行JAVA的序列化和反序列化

OBJECT STREAMS – SERIALIZATION AND DESERIALIZATION IN JAVA EXAMPLE USING SERIALIZABLE INTERFACE Hitesh Garg | November 7, 2014 | io | 9 Comments In the previous java tutorials I have discussed about basic of java streams, byte streams, then a modifie

Java的序列化与反序列化

Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化与反序列化 我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本.图片.音频.视频等, 而这些数据都会以二进制序列的形式在网络上传送.那么当两个Java进程进行通信时,能否实现进程间的对象传送

Java对象序列化和反序列化

Java对象序列化和反序列化 在Java中,我们如果要保存一个对象的瞬时状态值,以便在下次使用时能够得到这些值,或者持久化对象,或者使用RMI(远程方法调用),或在网络中传递对象时,此时我们就需要将对象序列化,实现序列化,我们只要实现Serializable接口,该接口是一个标记接口(Tag interface),即里面没有方法,其主要作用就是告诉JVM该类的对象可以进行序列化. 一般来说,很多类的对象都实现了Serializable接口,但是,有些对象是不能进行序列化的,比如与数据库相关的连接

JDK1.8 java.io.Serializable接口详解

java.io.Serializable接口是一个标志性接口,在接口内部没有定义任何属性与方法.只是用于标识此接口的实现类可以被序列化与反序列化.但是它的奥秘并非像它表现的这样简单.现在从以下几个问题入手来考虑. 希望对象的某些属性不参与序列化应该怎么处理? 对象序列化之后,如果类的属性发生了增减那么反序列化时会有什么影响呢? 如果父类没有实现java.io.Serializable接口,子类实现了此接口,那么父类中的属性能被序列化吗? serialVersionUID属性是做什么用的?必须申明