1. 一个类若想被序列化,则需要实现java.io.Serializable 接口,该接口中没有定义任何
方法,是一个标识性接口(Marker Interface),当一个类实现了该接口,就表示这个
类的对象是可以序列化的。
2. 在序列化时,static 变量是无法序列化的;如果A 包含了对B 的引用,那么在序列化
A 的时候也会将B 一并地序列化;如果此时A 可以序列化,B 无法序列化,那么当
序列化A 的时候就会发生异常,这时就需要将对B 的引用设为transient ,该关键字
表示变量不会被序列化。
3. 当我们在一个待序列化/反序列化的类中实现了以上两个 private 方法(方法声明要
与上面的保持完全的一致),那么就允许我们以更加底层、更加细粒度的方式控制序
列化/反序列化的过程。
package com.fgh.serializable;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* 如果需要特出处理 需要实现writeObject和readObject
* 这两个方法不属于任何一个类和任何一个接口 是非常特殊的方法
* 让自己控制序列化和反序列化的过程
* @author fgh
*
*/
public class SerializableTest2 {
public static void main(String[] args) throws Exception {
Person2 Person21 = new Person2("zhangsan", 21, 56.34);
Person2 Person22 = new Person2("lisi", 24, 23.42);
Person2 Person23 = new Person2("wangwu", 65, 67.45);
/**
* 序列化 把信息保存到磁盘上
*/
try {
FileOutputStream fos = new FileOutputStream("Person2.txt");
ObjectOutputStream ooStream = new ObjectOutputStream(fos);
ooStream.writeObject(Person21);
ooStream.writeObject(Person22);
ooStream.writeObject(Person23);
System.out.println("write success");
ooStream.close();
System.out.println("===================");
/**
* 把文件中内容读取到内存中 反序列化时不会调用对象的任何构造方法,仅仅根据所保存的对象状态信息 在内存中重新构建对象
*/
FileInputStream fis = new FileInputStream("Person2.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
try {
Person2 p = null;
for (int i = 0; i < 3; i++) {
p = (Person2) ois.readObject();
System.out.println("第" + Integer.valueOf(i + 1) + "个" + ":"
+ p.getName() + "," + p.getAge() + ","
+ p.getHeight() + ";");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
ois.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Person2 implements Serializable {
private static final long serialVersionUID = 2605116530076131408L;
// 加上transient 关键字 该属性将不会被保存
private String name;
private int age;
private double height;
public Person2(String name, int age, double height) {
super();
this.name = name;
this.age = age;
this.height = height;
}
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 double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
/**
* 如果需要特殊处理 需要实现这两个方法
*
* @param out
* @throws IOException
*/
private void writeObject(ObjectOutputStream out) throws IOException {
System.out.println("write Object...");
}
private void readObject(ObjectInputStream in) throws IOException {
System.out.println("read Object...");
}
}
分享到:
相关推荐
在编程领域,序列化和反序列化是两个关键的概念,特别是在数据存储、网络传输和对象持久化等场景中。它们允许我们将对象的状态转换为字节流(序列化),然后在需要的时候将字节流还原为原来的对象(反序列化)。在C#...
在IT领域,序列化和反序列化是两个关键的概念,特别是在数据存储、网络通信和分布式系统中。它们涉及将对象的状态转换为可持久化的格式(序列化),以及将这种格式还原回原来的对象(反序列化)。本文将深入探讨这两...
在IT领域,序列化和反序列化是两个关键的概念,特别是在网络通信、数据持久化以及对象存储中。本文将深入探讨Hessian框架的基础知识,它是一个高效的二进制序列化协议,广泛应用于Java和.NET之间跨语言通信。通过...
在本项目中,“学生管理系统(序列化和反序列化)”是一个基于Java或类似编程语言实现的系统,其核心功能是有效地存储和恢复学生信息。序列化和反序列化是这个系统的关键技术,它们允许程序将对象的状态转化为可存储...
protobuf序列化和反序列化技术是大数据处理领域中不可或缺的一部分,尤其在实时大数据场景下,高效的数据传输和存储对性能有着直接影响。谷歌推出的Protocol Buffers(简称protobuf)是一种语言无关、平台无关的数据...
本文将深入探讨如何使用JavaScript对表单数据进行序列化和反序列化。 序列化是将数据结构或对象转换为字符串的过程,便于存储或传输。在HTML表单中,序列化通常是指将表单元素的值转换为URL编码的字符串,以便通过...
在IT领域,JSON数据序列化和反序列化是数据处理的重要环节,尤其在Web开发中,它们在客户端与服务器之间传递数据时起到关键作用。 1. JSON数据格式:JSON数据由键值对组成,键用引号包围,然后冒号分隔,接着是值。...
Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 Maven: <groupId>com.github.xsonorg</groupId> <artifactId>xson-core <version>1.0.1 ...
- 实现此接口后,Java虚拟机就能够自动进行序列化和反序列化操作。 2. **序列化过程:** - 创建一个`java.io.ObjectOutputStream`实例。 - 使用`ObjectOutputStream`的`writeObject()`方法将对象写出到输出流中...
在编程世界中,序列化和反序列化是两个至关重要的概念,尤其是在C#这样的面向对象的语言中。它们允许我们将对象的状态转换为数据流,以便存储或传输,然后将这些数据流还原为原来的对象形式。本篇文章将深入探讨C#中...
.NET框架中的序列化和反序列化是数据转换的重要部分,特别是在与JSON格式交互时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易于人阅读和编写,同时也易于机器解析和生成,被广泛应用于...
在IT领域,序列化和反序列化是两个关键概念,主要应用于数据持久化、网络通信以及对象存储等场景。序列化是指将一个对象的状态转换为可存储或传输的形式,通常是二进制流;反序列化则相反,是将这个二进制流恢复为...
在Java编程语言中,对象的序列化和反序列化是两个关键的概念,它们允许我们将对象的状态转换为可存储或传输的格式,然后再恢复为原始对象。这个过程对于数据持久化、网络传输以及跨进程通信等场景非常有用。下面将...
java 序列化和反序列化的方法 Java 序列化和反序列化是 Java 语言中的一种机制,用于将对象转换为字节流,以便在网络上传输或存储。序列化是将对象转换为字节流的过程,而反序列化是将字节流转换回对象的过程。 在...
在***中处理JSON的序列化和反序列化是Web开发中常见的需求。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,由于其简洁性和易于阅读性,被广泛用于服务器与客户端之间的数据传输。下面将详细介绍**...
1. 复杂类型的处理:除了基本类型外,还可以序列化和反序列化自定义类、结构体以及容器(如vector、map等)。对于自定义类型,通常需要重载`operator和`operator>>`,或者使用nlohmann/json库中的`to_json`和`from_...
Java对象的序列化和反序列化是Java编程中一项重要的技术,主要用于将对象的状态转换为字节流,以便存储或在网络上传输。这一过程对于理解Java的IO操作、持久化数据以及实现分布式通信等场景非常关键。 首先,我们来...
Jackson是Java领域中广泛使用的JSON处理库,它提供了高效的JSON序列化和反序列化功能。在Java应用程序中,我们经常需要将Java对象转换为JSON字符串(序列化)或从JSON字符串恢复Java对象(反序列化),Jackson库就是...