对Java对象序列化的目的是持久化对象或者为RMI(远程方法调用)传递参数和返回值。

下面是一个序列化对象写入文件的例子:

----------------------------

 package utils;

 import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable; //同样需要实现Serializable
class Data implements Serializable {
private static final long serialVersionUID = 3502676600783498362L;
private String name;
public Data(String name){this.name=name;}
public String toString(){return "d:"+name;}
} //Serializable 为序列化标记接口,不包括任何方法
class User implements Serializable {
//序列化标识,用于标记类是否发生变化
private static final long serialVersionUID = -6950896768312602572L;
private transient String id; //transient关键字可以阻止该字段被序列化
private String name;
private int age;
private Data data; //包含另一个对象
public static String kind="human"; //static 字段不可序列化
public User(String id, String name, int age){
this.id=id;
this.name=name;
this.age=age;
this.data=new Data(name);
}
@Override
public String toString(){
return "["+id+"-"+name+"-"+age+"-"+kind+"-"+data+"]";
}
} public class SerialUtil {
//序列化会暴露对象所有信息(包括private),所以要对敏感信息加密后再序列化
public static void main(String[] args) throws IOException, ClassNotFoundException {
serialize(); //序列化
deSerialize(); //反序列化
} public static void serialize() throws IOException {
User bean1 = new User("1", "lg", 123);
User bean2 = new User("2", "ss", 23);
//ObjectOutputStream为对象输出流,输出到users文件中,名称后缀随意
ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(new File("users")));
oo.writeObject(bean1); //将对象序列化到输出流中
oo.writeObject(bean2); //写入另一个
oo.close();
} //如果远程jvm中没有User.class,将抛出ClassNotFoundException
public static void deSerialize() throws IOException, ClassNotFoundException {
//使用ObjectInputStream对象输入流读取文件,反序列化对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("users")));
User bean1 = (User) ois.readObject(); //通过二进制构造对象,并不是通过构造函数
User bean2 = (User) ois.readObject(); //读取下一个
ois.close();
System.out.println(bean1);
System.out.println(bean2);
} }

----------------------------

输出结果:

[null-lg-123-human-d:lg]

[null-ss-23-human-d:ss]

如果需要进一步定制序列化反序列化过程,可通过实现接口Externalizable,实现writeExternal和readExternal方法,下面是一个例子:

---------------------------------

 package demos;

 import java.io.Externalizable;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream; public class SerializeBean implements Externalizable{
private int i;
private String s;
private String ss; //从运行结果可见反序列化需要调用该默认构造器,如果为private则会抛出InvalidClassException
public SerializeBean(){
System.out.println("SerializeBean default constractor.");
} public SerializeBean(int i, String s, String ss){
this.i=i;
this.s=s;
this.ss=ss;
} @Override
public String toString(){
return "["+i+"-"+s+"-"+ss+"]";
} //序列化过程中自动调用
@Override
public void writeExternal(ObjectOutput out) throws IOException {
System.out.println("writeExternal here");
out.writeObject(s); //此处添加需要序列化的属性
out.writeInt(i);
} //反序列化过程中自动调用
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
System.out.println("readExternal here");
s=(String)in.readObject(); //此处添加自定义处理逻辑
i=in.readInt();
} public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
SerializeBean bean1 = new SerializeBean(99, "iamstring","ss");
SerializeBean bean2 = new SerializeBean(-44, "string too", "ss"); //序列化到文件
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("out"));
oos.writeObject(bean1);
oos.writeObject(bean2);
oos.close();
bean1=null;
bean2=null; //从文件反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("out"));
bean1 = (SerializeBean)ois.readObject();
bean2 = (SerializeBean)ois.readObject();
System.out.println(bean1);
System.out.println(bean2);
} }

---------------------------------

输出:

writeExternal here

writeExternal here

SerializeBean default constractor.

readExternal here

SerializeBean default constractor.

readExternal here

[99-iamstring-null]

[-44-string too-null]

ss并未序列化,可见起值为null

Java基础--序列化Serializable的更多相关文章

  1. java基础 序列化反序列化流 实现Serializable 接口 自动装载序列号到对象文本文件如修改不能反序列化对象文本,除非自定义long型常量 打印流

    package com.swift.baseKnowledge; import java.io.File; import java.io.FileInputStream; import java.io ...

  2. Java基础-序列化

    Java序列化是将一个对象编码成一个字节流,反序列化将字节流编码转换成一个对象. 序列化是Java中实现持久化存储的一种方法: 为数据传输提供了线路级对象表示法. Java的序列化机制是通过在运行时判 ...

  3. Java基础—序列化与反序列化(转载)

    转载自: Java序列化与反序列化 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化 ...

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

    常看到类中有一串很长的 如 private static final long serialVersionUID = -4667619549931154146L;的数字声明.这些其实是对此类进行序列化 ...

  5. Java 的序列化 (Serializable)(Day_09)

    我们的火,要把世界都点燃 运行环境 JDK8 + IntelliJ IDEA 2018.3 什么是序列化,反序列化 序列化是将对象状态转换为可保持或传输的格式的过程. 与序列化相对的是反序列化,它将流 ...

  6. Java基础(十一)--Serializable和Externalizable接口实现序列化

    序列化在日常开发中经常用到,特别是涉及到网络传输的时候,例如调用第三方接口,通过一个约定好的实体进行传输,这时你必须实现序列 化,这些都是大家都了解的内容,所以文章也会讲一下序列化的高级内容. 序列化 ...

  7. JAVA 对象序列化——Serializable

    1.序列化是干什么的?       简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存object st ...

  8. JAVA 对象序列化——Serializable(转)

    文章出自:http://www.cnblogs.com/chenfei0801/archive/2013/04/05/3001149.html Java的对象序列化是指将那些实现了Serializab ...

  9. Java基础——序列化

    Java的“对象序列化”能将一个实现了Serialiable接口(标记接口,没有任何方法)的对象转化为一组byte,这样日后要用到这个对象的时候,就能把这些byte数据恢复出来,并据此重新构建那个对象 ...

随机推荐

  1. INSPIRED启示录 读书笔记 - 第35章 情感接纳曲线

    技术接纳曲线 涉及了技术创新者.尝鲜者.早期消费大众.后期消费大众和跟随者,很少有产品能越过鸿沟——获得尝鲜者以外消费者的青睐 不同类型的用户具有不同的情感需求,除了技术接纳曲线模型描述用户外,还应该 ...

  2. tree 命令【转】

    本文转载自:http://www.jb51.net/LINUXjishu/283874.html linux下怎么用tree命令以树形结构显示文件目录结构?tree命令可以以树形结构显示文件目录结构, ...

  3. 互联网高并发之Hystrix实现服务隔离和降级

    当大多数人在使用Tomcat时,多个HTTP服务会共享一个线程池,假设其中一个HTTP服务访问的数据库响应非常慢,这将造成服务响应时间延迟增加,大多数线程阻塞等待数据响应返回,导致整个Tomcat线程 ...

  4. 泛型学习第二天——C#中的List<string>泛型类示例

    在C#代码中使用一系列字符串(strings)并需要为其创建一个列表时,List<string>泛型类是一个用于存储一系列字符串(strings)的极其优秀的解决办法.下面一起有一些Lis ...

  5. linux平台及windows平台mysql重启方法

    各个平台mysql 重启: inux平台及windows平台mysql重启方法 Linux下重启MySQL的正确方法: 1.通过rpm包安装的MySQL service mysqld restart ...

  6. Spring初学之bean的生命周期

    实体Bean: Car.java: package spring.beans.cycle; public class Car { private String name; private int pr ...

  7. 不小心把服务器上的/usr/lib下的所有文件删除,恢复办法

    手贱,使用root用户,rm -rf 多了一个"*"……导致了万分惊恐的悲剧,/usr/lib下的所有文件被删除…… 修复办法: linux系统是基于文件的,所以只要能拷贝到和原来 ...

  8. JMeter设置Http代理对web或者app进行录制

    一.录制web 1.首先保证JMeter的安装环境都正确.启动JMeter:在安装路径的bin目录下双击jmeter.bat (例如:D:\apache-jmeter-2.13\bin) ​2.打开J ...

  9. pandas读取Excel

    time31 = pd.read_excel('F:/save_file/3问出车表.xlsx', sheetname='Sheet1') # 读取‘3问出车表.xlsx’中的Sheet1表单, ti ...

  10. 51nod 1099 贪心/思维

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1099 1099 任务执行顺序 基准时间限制:1 秒 空间限制:13107 ...