java序列化1[实现Serializable接口]

简介:  * java默认序列化  * 1.实现Serializable接口(约定)  * 2.序列化和反序列化  * 3.实现java对象和字节序列的转换  * 4.将对象的字节序列(内存)持久化到磁盘(通常为文件),高并发session处理(减轻内存压力)  * 5.网络传输对象的字节序列,两个进程实现远程网络通信,(所有数据类型,都以二进制序列形式在网络上传送(接受发送))  *

 * java默认序列化
 * 1.实现Serializable接口(约定)
 * 2.序列化和反序列化
 * 3.实现java对象和字节序列的转换
 * 4.将对象的字节序列(内存)持久化到磁盘(通常为文件),高并发session处理(减轻内存压力)
 * 5.网络传输对象的字节序列,两个进程实现远程网络通信,(所有数据类型,都以二进制序列形式在网络上传送(接受发送))
 * 6.实现Serializable接口的类采用默认的序列化方式 。
* 7.静态变量(类变量)和transient修饰变量(不序列化属性修饰符),不被序列化,解看下测试:

 其他:java序列化2[实现Externalizable接口,可控序列化]

实现序列化接口Serializable的实体类代码:

package com.pakege.b;

import java.io.Serializable;
/**
 * java默认序列化
 * 1.实现Serializable接口(约定)
 * 2.序列化和反序列化
 * 3.实现java对象和字节序列的转换
 * 4.将对象的字节序列(内存)持久化到磁盘(通常为文件),高并发session处理(减轻内存压力)
 * 5.网络传输对象的字节序列,两个进程实现远程网络通信,(所有数据类型,都以二进制序列形式在网络上传送(接受发送))
 * 6.实现Serializable接口的类采用默认的序列化方式
 * */
public class SerializableTest implements Serializable{
	/**
	 * 序列化ID
	 * */
	private static final long serialVersionUID = -4036467956431644864L;
	private int id;
	private String name;
	private String age;
	private double balance;
	//静态变量,不能被序列化
	private static String cardNo = "0102221992212**53";
	//transient修饰变量,不能被序列化
	private transient String gender;
	//getter and setter
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public static void setCardNo(String cardNo) {
		SerializableTest.cardNo = cardNo;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public static String getCardNo() {
		return cardNo;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public double getBalance() {
		return balance;
	}
	public void setBalance(double balance) {
		this.balance = balance;
	}
}

序列化测试代码:

package com.pakege.b;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

import org.junit.Test;

public class Obj2BinaryAtDisk {
	@Test
	public void testObj2BinaryAtDisk(){
		//准备序列化对象
		SerializableTest customer = new SerializableTest();
		customer.setId(55555);
		customer.setName("Tony");
		customer.setAge("24");
		customer.setGender("男");
		customer.setBalance(9876543210.25d);
		//ObjectOutputStream对象输出流,完成对象到字节序列的转换(序列化)
		ObjectOutputStream out = null;
		try {
			out = new ObjectOutputStream(new FileOutputStream(new File("D:/XXXXX/Customer.txt")));
			//序列化(对象写入流字节序列中[写出实现Serializable接口对象的字段,不实现不写出])
			out.writeObject(customer);
			System.out.println("Obj2BinaryAtDisk序列化成功!");
		} catch (FileNotFoundException e) {
			System.out.println("序列化对象到磁盘文件,FileNotFoundException:"+e.getMessage());
		} catch (IOException e) {
			System.out.println("序列化对象到磁盘文件,IOException:"+e.getMessage());
		}finally{
			try {
				out.close();
			} catch (IOException e) {
				System.out.println("序列化对象到磁盘文件,输出对象关闭失败,IOException:"+e.getMessage());
			}
		}
	}
}


序列化结果:

Obj2BinaryAtDisk序列化成功!

反序列化测试代码:

package com.pakege.b;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.text.MessageFormat;

import org.junit.Test;
/**
 * cardNo为静态变量(类变量,类所有),不能被初始化
 * 对象都在堆,而静态变量在方法区
 * 序列化是对对象的操作
 * 静态会随着类的加载,进行初始化一次
 * */
public class Binary2ObjAtMemory {
	@Test
	public void testBinary2ObjAtMemory(){
		ObjectInputStream input = null;
			try {
				input = new ObjectInputStream(new FileInputStream(new File("D:/XXXXX/Customer.txt")));
				//反序列化(磁盘字节序列读入[实现Serializable接口对象,按序列化顺序反序列化并封装对象返回])
				SerializableTest customer = (SerializableTest) input.readObject();
				System.out.println(MessageFormat.format("id={0},name={1},age={2},balance={3},cardNo={4},gender={5}", customer.getId(),
						customer.getName(),customer.getAge(),customer.getBalance(),customer.getCardNo(),customer.getGender()));
				System.out.println("Obj2BinaryAtDisk序列化成功!");
			} catch (FileNotFoundException e) {
				System.out.println("反序列化到内存对象,FileNotFoundException:"+e.getMessage());
			} catch (ClassNotFoundException e) {
				System.out.println("反序列化到内存对象,ClassNotFoundException:"+e.getMessage());
			} catch (IOException e) {
				System.out.println("反序列化到内存对象,IOException:"+e.getMessage());
			}finally{
				try {
					input.close();
				} catch (IOException e) {
					System.out.println("反序列化到内存对象,输入对象关闭失败,IOException:"+e.getMessage());
				}
			}
	}
}


反序列化结果:

id=55,555,name=Tony,age=24,balance=9,876,543,210.25,cardNo=0102221992212**53,gender=null
Obj2BinaryAtDisk序列化成功!

注:静态变量(类变量)和transient修饰变量(不序列化属性修饰符),不被序列化,静态看下图(序列化是对'对象'的序列化):

解:没有静态属性在对象customer中,静态属性cardNo的值来自类型class加载静态初始化。

目录
相关文章
|
2天前
|
安全 Java
在 Java 中使用实现 Runnable 接口的方式创建线程
【10月更文挑战第22天】通过以上内容的介绍,相信你已经对在 Java 中如何使用实现 Runnable 接口的方式创建线程有了更深入的了解。在实际应用中,需要根据具体的需求和场景,合理选择线程创建方式,并注意线程安全、同步、通信等相关问题,以确保程序的正确性和稳定性。
|
1天前
|
存储 缓存 安全
🌟Java零基础:深入解析Java序列化机制
【10月更文挑战第20天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
9 3
|
4天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
6天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
11 3
|
6天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
18 2
|
6天前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
15 2
|
3天前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
6 0
时间轮-Java实现篇
在前面的文章《[时间轮-理论篇](https://developer.aliyun.com/article/910513)》讲了时间轮的一些理论知识,然后根据理论知识。我们自己来实现一个简单的时间轮。
|
3天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
71 38
|
23小时前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?