序列化、实体Bean序列化

本文详细介绍了Java对象序列化的概念、实现方法以及应用场景。包括如何定义序列化类、序列化操作步骤、序列化的目的和重要性,特别是对于Bean实现序列化时的注意事项。解释了如何在不同平台间实现对象的跨平台传输与恢复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java对象序列化:

1、 对象序列化:将一个对象转换成二级制数据流,如果一个类的对象要想实现对象序列化,则对象必须实现Serializable接口,该Serializable接口没有任何方法,此接口只是作为一个标识,表示本类的对象具备了序列化的能力而已。对象序列化是java的一个特征,通过该特征可以将对象写作一组字节码,当在其他位置读到这些字节码时,可以依此创建一个新的对象,而且新对象的状态与原对象完全相同。序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。一般程序在运行时,产生对象,这些对象随着程序的停止运行而消失,但如果我们想把某些对象(因为是对象,所以有各自不同的特性)保存下来,在程序终止运行后,这些对象仍然存在,可以在程序再次运行时读取这些对象的值,或者在其他程序中利用这些保存下来的对象。这种情况下就要用到对象的序列化。

定义一个Person实体类实现了Serializable接口;

Public class Person iimplements Serializable;
//序列化操作;
ObjectOutputStream oos = null ;
oos = new ObjectOutputStream(new FileOutputStream(file)) ;
Person per = new Person("张三",20) ;
oos.writeObject(per) ;
oos.close() ;

//反序列化操作;
ObjectInputStream ois = null ;
ois = new ObjectInputStream(new FileInputStream(file))  ;
Object obj = ois.readObject() ;
Person per = (Person)obj ;

2为什么要序列化?

Java"对象序列化"能让你将一个实现了Serializable接口的对象转换成一组byte,这样日后要用这个对象时候,你就能把这些byte数据恢复出来,并据此重新构建那个对象了。这一点甚至在跨网络的环境下也是如此,这就意味着序列化机制能自动补偿操作系统方面的差异。也就是说,你可以在Windows机器上创键一个对象,序列化之后,再通过网络传到Unix机器上,然后在那里进行重建。你不用担心在不同的平台上数据是怎样表示的,byte顺序怎样,或者别的什么细节。之所以需要对象序列化,是因为有时候对象需要在网络上传输,传输的时候需要这种序列化处理,从服务器硬盘上把序列化的对象取出,然后通过网络传到客户端,再由客户端把序列化的对象读入内存,执行相应的处理。

 3Bean实现序列化

当一个JavaBean在构造工具内被用户化,并与其它Bean建立连接之后,它的所有状态都应当可被保存,下一次被load进构造工具内或在运行时,就应当是上一次修改完的信息。为了能做到这一点,要把Bean的某些字段的信息保存下来,在定义Bean时要使它实现Java.io.Serializable接口。

  实现了序列化接口的Bean中字段的信息将被自动保存。若不想保存某些字(这里的Bean中字段的信息将被自动保存是什么意思?这个自动保存是怎么实现的?)

  段的信息则可在这些字段前冠以transientstatic关键字,transientstatic变量的信息是不可被保存的。通常,一个Bean所有公开出来的属性都应当是被保存的,也可有选择地保存内部状态。Bean开发者在修改软件时,可以添加字段,移走对其它类的引用,改变一个字段的privateprotectedpublic状态,这些都不影响类的存储结构关系。然而,当从类中删除一个字段,改变一个变量在类体系中的位置,把某个字段改成transient/static,或原来是transient/static,现改为别的特性时,都将引起存储关系的变化。


### 如何在 Redis 中使用 FastJSON 对不同实体进行序列化和反序列化 为了实现在 Redis 中利用 FastJSON 来处理不同类型的数据对象的序列化与反序列化操作,可以创建自定义的 `RedisSerializer` 实现类来适配特定的需求。下面是一个具体的例子展示如何完成这一过程。 #### 创建 FastJSON 序列化器 首先构建一个名为 `FastJsonRedisSerializer` 的工具类用于支持多种类型的对象转换: ```java import com.alibaba.fastjson.JSON; import org.springframework.data.redis.serializer.RedisSerializer; public class FastJsonRedisSerializer<T> implements RedisSerializer<T> { private Class<T> clazz; public FastJsonRedisSerializer(Class<T> clazz) { this.clazz = clazz; } @Override public byte[] serialize(T t) throws Exception { if (t == null){ return new byte[0]; } return JSON.toJSONString(t).getBytes("UTF-8"); } @Override public T deserialize(byte[] bytes) throws Exception { if(bytes.length<=0){ return null; } String str=new String(bytes,"UTF-8"); return JSON.parseObject(str,clazz); } } ``` 此代码片段展示了怎样通过继承 Spring Data Redis 提供的标准接口 `RedisSerializer` 并重写其方法以适应 FastJSON 特性的做法[^3]。 #### 配置 RedisTemplate 使用 FastJSON 序列化器 为了让应用程序能够识别并应用上述定制化的序列化逻辑,在配置文件中指定相应的设置非常重要。对于基于 Spring Boot 构建的应用程序而言,可以通过如下方式调整默认行为: ```yaml spring: redis: database: 0 host: localhost port: 6379 lettuce: pool: max-active: 8 max-idle: 8 min-idle: 0 template: value-serializer: com.example.FastJsonRedisSerializer ``` 注意这里的路径应当指向实际项目中的包位置以及具体实现类名称。另外一种更灵活的方式是在 Java Config 类里直接注入所需组件实例: ```java @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); // 替换成我们自己的fastjson序列化器 FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class); template.setValueSerializer(fastJsonRedisSerializer); template.setHashValueSerializer(fastJsonRedisSerializer); template.afterPropertiesSet(); return template; } } ``` 这段配置确保了当涉及到键值存储时,默认采用的是由前面所定义好的 FastJSON 处理机制来进行数据编码解码工作[^4]。 #### 测试案例 最后编写简单的单元测试验证整个流程是否正常运作: ```java @SpringBootTest class DemoApplicationTests { @Autowired private RedisTemplate<String,Object> redisTemplate; @Test void testSerialization() { User user = new User(); // 假设有一个User POJO user.setId(1L); user.setName("John Doe"); // 存储到Redis redisTemplate.opsForValue().set("user", user); // 获取并断言结果一致 User result = (User) redisTemplate.opsForValue().get("user"); assertEquals(user.getName(),result.getName()); } } ``` 以上就是关于如何借助 FastJSON 完成 Redis 数据交互过程中涉及的对象序列化/反序列化工作的介绍[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值