Java序列化之Rebis存储序列化,java序列化rebis
分享于 点击 11296 次 点评:10
Java序列化之Rebis存储序列化,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参考:
转载自:Java基础学习总结——Java对象的序列化和反序列化
相关文章
- 暂无相关文章
用户点评