热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java的Serializable接口怎么使用

这篇文章主要介绍“Java的Serializable接口怎么使用”,在日常操作中,相信很多人在Java的Serializable接口怎么使用问题上存在疑惑,小编查阅了各

这篇文章主要介绍“Java的Serializable接口怎么使用”,在日常操作中,相信很多人在Java的Serializable接口怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java的Serializable接口怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、Serializable:序列化

1、Serializable位于java.io包中,用于实现Java类的序列化操作而提供的一个语义级别的接口。没有任何方法或者字段,只是用于标识可序列化的语义。

2、如类中的有些字段不想序列化,可用关键字:transient修饰。

3、序列化可通过ObjectOutputStream实现,反序列化可通过ObjectInputStream实现。

4、自定义序列化实现接口:Externalizable

5、序列化作用:用于网络传输(RPC远程调用); 将对象保存到磁盘(tomcat的钝化和活化)

6、使用建议:实现序列化接口,请增加:

private static final long serialVersionUID = 1L;

7、可直接通过序列化字节流使用

// 将对象本身序列化到字节流
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

ObjectOutputStream objectOutputStream =

new ObjectOutputStream( byteArrayOutputStream );

objectOutputStream.writeObject( this );

// 再将字节流通过反序列化方式得到对象副本
ObjectInputStream objectInputStream =

new ObjectInputStream( new ByteArrayInputStream( byteArrayOutputStream.toByteArray() ) );

Object object = objectInputStream.readObject();

8、可通过java命令:serialver [-classpath classpath] [-show] [classname...] 查看类的序列化值

The -classpath option specifies where to look for the classes (in directories or jar files, separated by semicolon marks ;).

The -show option displays a simple user interface that allows the user to enter a full class name and then press Enter key or click Show button to display the serialVersionUID number.

示例:

//win+R打开cmd输入以下命令:

serialver -classpath E:\j2se-example\target\classes net.liuzd.j2se.example.copy.MyDong

Java的Serializable接口怎么使用

二、例子

1、测试类

1.1 代码示例
 

package net.liuzd.j2se.example.copy;

import java.io.*;

public class DongSerializableTest {

static String fileName = "dong.ser";

public static void main(String[] args) throws Exception {

Dong dong = new Dong();

dong.setName("杨过");

dong.setAge(19);

//

ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(fileName));

outputStream.writeObject(dong);

outputStream.close();

//

ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName));

Dong readDong = (Dong) inputStream.readObject();

System.out.println(readDong);

}

}


class Dong implements Serializable {

private String name;

private int age;

public Dong() {

}

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 "Dong{" +

"name='" + name + '\'' +

", age=" + age +

'}';

}

}

1.2 运行后,成功打印出结果: Dong{name='杨过', age=19}

2、测试类再增加一个属性

2.1 测试类再增加一个属性:sex及对应的get,set方法,重写toString()方法。

private int sex;

public int getSex() {

   return sex;

}

public void setSex(int sex) {

  this.sex = sex;

}


@Override

public String toString() {

return "Dong{" +

"name='" + name + '\'' +

", age=" + age +

", sex=" + sex +

'}';

}

2.2 直接运行方法:

ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName));

Dong readDong = (Dong) inputStream.readObject();

System.out.println(readDong);

2.3 发现报错了:

Exception in thread "main" java.io.InvalidClassException: net.liuzd.j2se.example.copy.Dong; local class incompatible: stream classdesc serialVersionUID = 2001103299326914393, local class serialVersionUID = 1180199239641161346

at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:699)

at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1963)

at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1829)

at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2120)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1646)

at java.io.ObjectInputStream.readObject(ObjectInputStream.java:482)

at java.io.ObjectInputStream.readObject(ObjectInputStream.java:440)

at net.liuzd.j2se.example.copy.DongSerializableTest.main(DongSerializableTest.java:20)

2.4 发现问题:

2.4.1、我们没有指定serialVersionUID,JDK8自动帮我们生成了一个

2.4.2、发现二个serialVersionUID不一致,才导致了运行错误。

2.5 查看接口:serializable的文档

2.5.1 明确指出需要我们显式声明为:private static final long serialVersionUID,这个对继承成员无用。

2.5.2 默认的serialVersionUID值对类细节高度敏感,这些细节可能因编译器而异实现,并因此可能导致意外的结果:InvalidClassException

2.5.3 其中的一段文档注释:

If a serializable class does not explicitly declare a serialVersionUID, then

the serialization runtime will calculate a default serialVersionUID value

for that class based on various aspects of the class, as described in the

Java(TM) Object Serialization Specification. However, it is strongly

recommended that all serializable classes explicitly declare

serialVersionUID values, since the default serialVersionUID computation is

highly sensitive to class details that may vary depending on compiler

implementations, and can thus result in unexpected

InvalidClassExceptions during deserialization. Therefore, to

guarantee a consistent serialVersionUID value across different java compiler

implementations, a serializable class must declare an explicit

serialVersionUID value. It is also strongly advised that explicit

serialVersionUID declarations use the private modifier where

possible, since such declarations apply only to the immediately declaring

class--serialVersionUID fields are not useful as inherited members. Array

classes cannot declare an explicit serialVersionUID, so they always have

the default computed value, but the requirement for matching

serialVersionUID values is waived for array classes.

2.6 实践

2.6.1 只增加serialVersionUID属性

如果我们只在1.1中指定serialVersionUID,再试一次,结果会怎么样?(没有增加sex哟)

操作步骤:我们在1.1中的类: Dog 增加serialVersionUID属性。

private static final long serialVersiOnUID= 1L;

再次运行结果:如1.2所示。

2.6.2 重复第2.1步骤哟,其它不变哟。

2.6.3 重复第2.2步骤,运行结果:正确 !

Dong{name='杨过', age=19, sex=0}

到此,关于“Java的Serializable接口怎么使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程笔记网站,小编会继续努力为大家带来更多实用的文章!


推荐阅读
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
  • 本文介绍了如何利用Apache POI库高效读取Excel文件中的数据。通过实际测试,除了分数被转换为小数存储外,其他数据均能正确读取。若在使用过程中发现任何问题,请及时留言反馈,以便我们进行更新和改进。 ... [详细]
  • 在处理大图片时,PHP 常常会遇到内存溢出的问题。为了避免这种情况,建议避免使用 `setImageBitmap`、`setImageResource` 或 `BitmapFactory.decodeResource` 等方法直接加载大图。这些函数在处理大图片时会消耗大量内存,导致应用崩溃。推荐采用分块处理、图像压缩和缓存机制等策略,以优化内存使用并提高处理效率。此外,可以考虑使用第三方库如 ImageMagick 或 GD 库来处理大图片,这些库提供了更高效的内存管理和图像处理功能。 ... [详细]
  • MongoDB高可用架构:深入解析Replica Set机制
    MongoDB的高可用架构主要依赖于其Replica Set机制。Replica Set通过多个mongod节点的协同工作,实现了数据的冗余存储和故障自动切换,确保了系统的高可用性和数据的一致性。本文将深入解析Replica Set的工作原理及其在实际应用中的配置和优化方法,帮助读者更好地理解和实施MongoDB的高可用架构。 ... [详细]
  • 结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法
    结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法 ... [详细]
  • 本文深入探讨了CGLIB BeanCopier在Bean对象复制中的应用及其优化技巧。相较于Spring的BeanUtils和Apache的BeanUtils,CGLIB BeanCopier在性能上具有显著优势。通过详细分析其内部机制和使用场景,本文提供了多种优化方法,帮助开发者在实际项目中更高效地利用这一工具。此外,文章还讨论了CGLIB BeanCopier在复杂对象结构和大规模数据处理中的表现,为读者提供了实用的参考和建议。 ... [详细]
  • 本文详细介绍了 jQuery 的入门知识与实战应用,首先讲解了如何引入 jQuery 库及入口函数的使用方法,为初学者提供了清晰的操作指南。此外,还深入探讨了 jQuery 在实际项目中的多种应用场景,包括 DOM 操作、事件处理和 AJAX 请求等,帮助读者全面掌握 jQuery 的核心功能与技巧。 ... [详细]
  • CentOS 7环境下Jenkins的安装与前后端应用部署详解
    CentOS 7环境下Jenkins的安装与前后端应用部署详解 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • 在Kubernetes上部署多个Mitmproxy代理服务器以实现高效流量管理 ... [详细]
  • 每日精选Codeforces训练题:1119E(贪心算法)、821C(栈模拟)和645D(拓扑排序)
    题目涉及三种不同类型的算法问题:1119E(贪心算法)、821C(栈模拟)和645D(拓扑排序)。其中,1119E的问题背景是有n种不同长度的棍子,长度分别为2^0, 2^1, …, 2^(n-1),每种棍子的数量为a[i]。任务是计算可以组成的三角形数量。根据三角形的性质,任意两边之和必须大于第三边。该问题可以通过贪心算法高效解决,通过合理选择棍子组合来最大化三角形的数量。 ... [详细]
  • 在尝试对从复杂 XSD 生成的类进行序列化时,遇到了 `NullReferenceException` 错误。尽管已经花费了数小时进行调试和搜索相关资料,但仍然无法找到问题的根源。希望社区能够提供一些指导和建议,帮助解决这一难题。 ... [详细]
  • Pentaho Data Integration 中 BaseStep 类 getOutputRowSets 方法详解与代码实例 ... [详细]
  • 在多模块项目中,项目A作为一个独立的工具包,不依赖于任何第三方库。其目录结构如下:`--src--main--java--resources`。当将项目A打包成JAR文件后,发现无法正确访问`resources`目录下的文件资源。这一问题可能源于JAR文件的构建配置或类路径设置不当,需要仔细检查Maven或Gradle的构建脚本,确保资源文件被正确包含并加载。 ... [详细]
  • 本题库精选了Java核心知识点的练习题,旨在帮助学习者巩固和检验对Java理论基础的掌握。其中,选择题部分涵盖了访问控制权限等关键概念,例如,Java语言中仅允许子类或同一包内的类访问的访问权限为protected。此外,题库还包括其他重要知识点,如异常处理、多线程、集合框架等,全面覆盖Java编程的核心内容。 ... [详细]
author-avatar
夕阳何处寻
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有