JAVA笔记——序列化

简介:

所谓的对象序列化(在很多地方也被成为串行化),是指将对象转换成二进制数据流的一种实现手段。通过将对象序列化,可以方便地实现对象的传输及保存。

  在Java中提供有ObjectInputStream与ObjectOutputStream这两个类用于序列化对象的操作。这两个类是用于存储和独缺对象的输入输出流类,只要把对象中的所有成员变量都存储起来,就等于保存了这个对象,之后从保存的对象之中再将对象读取进来就可以继续使用此对象。ObjectInputStream类与ObjectOutputStream类,用于帮助开发者完成保存和读取对象成员变量取值的过程,但要求读写或存储的对象必须实现了Serializable接口,但Serializable接口中没有定义任何方法,仅仅被用作一种标志,已被编译器作特殊处理。

  下面是对象的序列化范例:

 import java.io.* ;
 public class Person implements Serializable
 {
  private String name ;
  private int age ;
  public Person(String name,int age)
  {
   this.name = name ;
   this.age = age ;
  }
  public String toString()
  {
   return " 姓名:"+this.name+",年龄:"+this.age ;
  }
 };

  这个类实现了Serializable接口,所以此类的对象可序列化。下面的范例使用ObjectOutputStream与ObjectInputStream将Person类的对象保存在文件之中:

 import java.io.*;
 public class SerializableDemo
 {
  public static void main( String args[] ) throws Exception
  {
   File f = new File("SerializedPerson") ;
   serialize(f);
   deserialize(f);
  }
 
  // 以下方法为序列化对象方法
  public static void serialize(File f) throws Exception
  {
   OutputStream outputFile = new FileOutputStream(f);
   ObjectOutputStream cout = new ObjectOutputStream(outputFile);
   cout.writeObject(new Person("张三",25));
   cout.close();
  }
  // 以下方法为反序列化对象方法
  public static void deserialize(File f) throws Exception
  {
   InputStream inputFile = new FileInputStream(f);
   ObjectInputStream cin = new ObjectInputStream(inputFile);
   Person p = (Person) cin.readObject();
   System.out.println(p);
  }
 }

  在程序中声明了一个deserialize()方法,此方法用于从文件中读取已经保存的对象。

  另外,如果不希望类中的某个属性被序列化,可以在声明属性之前加上transient关键字。用这个关键字修饰的属性没有被保存下来,输出时,将输出默认值。   



最新内容请见作者的GitHub页:http://qaseven.github.io/

   

目录
相关文章
|
19天前
|
Java API
Java基础—笔记—API篇
这篇内容介绍了Java中的API相关知识,包括`Object`类作为所有类的父类,其核心方法`toString()`、`equals()`和`clone()`。`toString()`默认返回对象地址,重写后可返回内容;`equals()`默认比较地址,重写后比较内容。`clone()`用于对象克隆,提到了浅克隆与深克隆的概念。此外,还介绍了`Objects`工具类,它提供如`equals()`、`isNull()`和`nonNull()`等方法进行条件判断。
16 0
|
19天前
|
设计模式 Java
Java基础—笔记—多态、final、抽象类、接口篇
该文介绍了编程中的多态、final和抽象类、接口相关概念。多态允许子类重写父类方法,通过父类引用调用子类方法,实现解耦和提高代码灵活性,但也可能导致无法使用子类特有功能,需通过强制类型转换解决。final用于修饰不可变的类、方法或变量,防止继承、重写和多次赋值。抽象类是一种包含抽象方法的类,用于强制子类重写特定方法,实现多态,适用于模板方法设计模式,解决代码重复问题。
24 0
|
19天前
|
Java
Java基础—笔记—继承篇
该内容介绍了Java中的继承概念。继承允许子类从父类继承属性和方法,简化代码并提高复用性。格式是`public class 子类 extends 父类`。特点包括子类能访问非私有数据,方法可以被重写(@Override标记),但私有和静态方法不能重写。权限修饰符有private、缺省、protected和public。Java支持单继承和多层继承,所有类间接继承自Object类。继承后,成员访问遵循就近原则,this指代本类,super指代父类。子类构造器默认调用父类无参构造器,也可通过super调用有参构造器。
18 0
|
19天前
|
Java
Java基础—笔记—static篇
`static`关键字用于声明静态变量和方法,在类加载时初始化,只有一份共享内存。静态变量可通过类名或对象访问,但推荐使用类名。静态方法无`this`,不能访问实例成员,常用于工具类。静态代码块在类加载时执行一次,用于初始化静态成员。
13 0
|
19天前
|
存储 Java 容器
Java基础—笔记—ArrayList篇
ArrayList是Java中的一个集合类,用于存储同种类型的多个值,与数组相比,它的长度可变。集合只能存放引用数据类型,而数组可存任意类型。泛型如ArrayList<T>用于限定集合中元素的类型。常用方法包括增(add()、add(int,E))、删(remove(int)、remove(Object))、改(set(int,E))、查(get(int))以及获取大小(size())。
12 0
|
19天前
|
Java
Java基础—笔记—接口篇
接口是Java中的一个抽象概念,用于创建数据结构,类似于更纯粹的抽象类。定义包括常量(默认public static final)和抽象方法(默认public abstract)。接口通过子类实现,如`public class 子类 implements 接口1, 接口2...`。JDK8后增加了默认方法(通过子类对象调用)和静态方法(通过接口名调用)。JDK9引入了私有方法,仅在接口默认方法中调用。目的是在不修改子类的情况下扩展功能。一个类可以继承一个父类并实现多个接口,一个接口可继承多个接口。
14 0
|
19天前
|
存储 安全 Java
Java一分钟之-Java序列化与反序列化
【5月更文挑战第14天】Java序列化用于将对象转换为字节流,便于存储和网络传输。实现`Serializable`接口使类可被序列化,但可能引发隐私泄露、版本兼容性和性能问题。要避免这些问题,可使用`transient`关键字、控制`serialVersionUID`及考虑使用安全的序列化库。示例代码展示了如何序列化和反序列化对象,强调了循环引用和未实现`Serializable`的错误。理解并妥善处理这些要点对优化代码至关重要。
22 1
|
2天前
|
存储 Java 索引
Java笔记(3)
该文介绍了数据结构的基础知识,包括集合类型和遍历方式。集合分为ArrayList(有序、可重复、有索引)和Set(无序、不重复、无索引)。遍历集合可使用Iterator、增强for循环和Lambda表达式。HashMap是Map接口的实现,用于存储键值对,提供添加、删除、查找等操作。LinkedHashMap保持插入顺序。文章还提及了二叉树的概念,如平衡二叉树和红黑树,并列举了一些常用的Java开发快捷键,以及如何添加依赖。
12 2
|
3天前
|
数据采集 Java API
Java笔记(2)
Java命名规范:包名全小写,类与接口首字母大写驼峰式,枚举同上;方法小写驼峰式,动词开头;变量小写驼峰,常量全大写,下划线分隔;参数和局部变量同变量规则;布尔变量避免简单is或has开头。Java调试用jps、jhsdb、javap。常用API包括Math(如abs、ceil)、System(如exit、arraycopy)、Runtime(如getRuntime、exec)、Object(如toString、equals)、BigInteger(大整数操作)、正则表达式、日期处理和Collections(如addAll、shuffle)。
10 0
|
3天前
|
设计模式 Java C++
Java笔记
Java基础易错点: equals与==区别,构造函数,访问修饰符,Object是所有类的父类,空指针异常。入门涉及Scanner输入,字符串处理,静态与非静态,类型转换,面向对象涵盖可变参数,内部类,JavaBean,重载,封装,继承,接口,多态,强转和泛型。注意静态方法不能调用非静态成员,可变参数本质是数组,泛型不具继承性。
8 0