识字粗堪供赋役,不须辛苦慕公卿。这篇文章主要讲述学习Java必备的基础知识打卡12.28,要想学好必须扎实基本功(?建议收藏)#yyds干货盘点#相关的知识,希望能为你提供帮助。
Day34-java之对象序列化@[toc]
关于作者? 作者介绍
所有的项目都一定有序列化的概念。
对象序列化的概念
所谓的对象序列化是指在内存中保存的对象变为二进制流的形式进行传输,或者将其保存在文本中。但是我们并不意味着所有对象都可以被序列化,严格来讲,我们需要被实例化的类对象往往需要传输使用,同时这个类 必须实现java.io.Serializable接口。但是这个接口没有任何方法定义,所以只是一个标识。
package com.day15.demo;
import java.io.Serializable;
class Person implements Serializable
private String name;
private int age;
public Person(String name, int age)
this.name = name;
this.age = age;
public String getName()
return name;
public void setName(String name)
this.name = name;
public int getAge()
return age;
public void setAge(int age)
this.age = age;
public class SerializableDemo
序列化对象是所需要保存的就是对象中的属性所以默认情况下对象的属性将被转为二进制数据流存储。
实现序列化和反序列化
如果要想进行对象的序列化和反序列话的手工操作,在java之中提提供了两个操作类:ObjectOutputStream,ObjectInputStream,而这两个类的继承结构,构造方法,操作方法定义如下:
ObjectOutputStream | ObjectInputStream |
---|---|
java.lang.Object< br/> java.io.OutputStream< br/> java.io.ObjectOutputStream | java.lang.Object< br/> java.io.InputStream< br/> java.io.ObjectInputStream |
public ObjectOutputStream(OutputStream out)< br/> throws IOException | public ObjectInputStream(InputStream in)< br/> throws IOException |
public final void writeObject(Object obj)< br/> throws IOException | public final Object readObject()< br/> throws IOException,ClassNotFoundException |
文章图片
文章图片
package com.day15.demo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Arrays;
class Person implements Serializable
private String name;
private int age;
public Person(String name, int age)
this.name = name;
this.age = age;
public String getName()
return name;
public void setName(String name)
this.name = name;
public int getAge()
return age;
public void setAge(int age)
this.age = age;
@Override
public String toString()
return "Person [name=" + name + ", age=" + age + "]";
public class SerializableDemo
public static final File FILE = new File("F:" + File.separator + "test" + File.separator + "person.txt");
public static void ser(Object o) throws Exception
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(FILE));
outputStream.writeObject(o);
outputStream.close();
public static void dser() throws Exception
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(FILE));
System.out.println(inputStream.readObject());
inputStream.close();
public static void main(String[] args) throws Exception
//序列化
//ser(new Person("张麻子",20));
//反序列化
dser();
如果出现com.day15.demo.Person@6d311334这个情况的主要原因是因为实体类没有进行toString()方法的重写。
transient关键字(了解)
实际上序列化的处理在Java.io有两类,Serializable是使用最多的序列化接口,这种操作采用自动化的模式完成,默认情况下所有的属性都会进行序列化。有一个Externalizable接口需要用户手动序列化处理。
由于默认情况Serializable会将对象中的所有属性进行保存,但是如果现在有某些属性不希望被保存了,那么可以使用transient关键字。
package com.day15.demo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Arrays;
class Person implements Serializable
private transient String name;
private int age;
public Person(String name, int age)
this.name = name;
this.age = age;
public String getName()
return name;
public void setName(String name)
this.name = name;
public int getAge()
return age;
public void setAge(int age)
this.age = age;
@Override
public String toString()
return "Person [name=" + name + ", age=" + age + "]";
public class SerializableDemo
public static final File FILE = new File("F:" + File.separator + "test" + File.separator + "person.txt");
public static void ser(Object o) throws Exception
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(FILE));
outputStream.writeObject(o);
outputStream.close();
public static void dser() throws Exception
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(FILE));
System.out.println(inputStream.readObject());
inputStream.close();
public static void main(String[] args) throws Exception
ser(new Person("张麻子",20));
dser();
/*
Person [name=null, age=20]
*/
【学习Java必备的基础知识打卡12.28,要想学好必须扎实基本功(?建议收藏)#yyds干货盘点#】发现此处name没有进行序列化操作。使用序列化往往在简单java类上使用,其他类上使用序列化的使用很少,但是在简单java类中基本上不去使用transient。
推荐阅读
- 手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏02支持中文及显示FPS
- 鸿蒙轻内核Kconfig使用笔记-进阶
- #yyds干货盘点#JavaScript - 字符串的转义
- Apache Geode 的 Spring 数据教程二十
- flink算子
- 第5章 IP基本原理1-H3C认证网络工程师(H3CNE)
- 跟着动画学 Go 数据结构之 Go 实现栈#私藏项目实操分享#
- win7系统用户名查看 迅速查看系统之家Win7纯净版系统用户名及SID的技巧
- win7系统诊断工具 系统诊断工具迅速处理电脑公司win7系统音箱没声音的问题