Java序列化之Rebis存储序列化

1.什么是java序列化

  • 把对象转换为字节序列的过程称为对象的序列化。
  •  把字节序列恢复为对象的过程称为对象的反序列化。 

2.为什么(什么时候)要java序列化

     对象的序列化主要有两种用途:
  • 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
  • 在网络上传送对象的字节序列。

3.怎样序列化

      java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
  java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
  只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。
  对象序列化包括如下步骤:
  1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;
  2) 通过对象输出流的writeObject()方法写对象。


  对象反序列化的步骤如下:
  1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;
  2) 通过对象输入流的readObject()方法读取对象。

4.Redis使用时的序列化

       Redis使用时的序列化主要是用到了ByteArrayOutputStream和ByteArrayInputStream
        为什么这里又不使用3中提到的ObjectOutputStream和ObjectInputStream呢?其实也要用到,但是要配合ByteArrayOutputStream类使用。
      因为ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。而我们在使用Redis的时候需要将输出流定向给自己的Redis接口使用(就是不需要输出到文件或网络套接字),这样就可以使 用ObjectOutputStream把流流向ByteArrayOutputStream,而ByteArrayOutputStream.toArrayByte()方法就可以把  byte[]丢给Rebis的接口处理了。

  说了这么多,举个例子说明:
 向文件中序列化时:
  ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(new File("D:\\a.txt")));
  oo.wirteObj(new Student(1,"boy"));
  oo.close(); 这时候把student序列化到a.txt;
 而我们现在不需要序列化到文件,要把序列化后的二进制给redis就需要这样:
  ByteArrayOutputStream bo = new ByteArrayOutputStream();
  ObjectOutputStream oo = new ObjectOutputStream(bo);
  oo.write(new Student(1,"boy")); //这时候是序列化到bo;
  return bo.toArrayByte(); //将序列化到bo的二进制返回
  

5.上代码

第一个是序列化工具类
public class SerializableTest {
	
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		Student s = new Student("sgming","20");
		Serialize(s);
//		Student s2 = (Student)Deserialize();
//		System.out.println(s2);
	}
	
	/**
	 * 序列化对象
	 * 
	 * @param obj 要序列化的对象
	 * @return 序列化后的byte[]
	 * @throws IOException
	 */
	public static byte[] Serialize(Object obj) throws IOException {
		ByteArrayOutputStream objOut= new ByteArrayOutputStream();
		ObjectOutputStream oo = new ObjectOutputStream(objOut);
		oo.writeObject(obj);
		objOut.close();
		oo.close();
		return objOut.toByteArray();
	}
	
	/**
	 * 将byte[]反序列化为对象
	 * 
	 * @param bytes 准备反序列化的二进制
	 * @return 反序列化后的对象
	 * @throws FileNotFoundException
	 * @throws IOException
	 * @throws ClassNotFoundException
	 */
	public static Object Deserialize(byte[] bytes) throws FileNotFoundException, IOException, ClassNotFoundException {
		Object s;
		ByteArrayInputStream bo = new ByteArrayInputStream(bytes);
		ObjectInputStream objIn = new ObjectInputStream(bo);
		s =objIn.readObject();
		bo.close();
		objIn.close();
		return s;
	}
}
第二个是jedis操作的测试类,model就不上传了,记得要要Serialize。。ID
public class RedisTest {
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		Jedis jedis = new Jedis("127.0.0.1");  
		Student s= new Student(1, "redis", 10, null);
//		System.out.println(SerializableTest.Serialize("student"));;
//		System.out.println(SerializableTest.Serialize(s));
		jedis.set(SerializableTest.Serialize("student"),SerializableTest.Serialize(s));  
		System.out.println( SerializableTest.Deserialize(jedis.get(SerializableTest.Serialize("student"))));
	}
}
运行结果显而易见:
name=redis id=1 age=10


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值