有人问及相关问题,就顺便贴出代码。其实方法都很简单:
//对象序列化写入文件
public static void writeObject(Object obj, File file) throws FileNotFoundException, IOException {
if (obj == null)
throw new NullPointerException("obj are null.");
ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(
new FileOutputStream(file)));
try {
oos.writeObject(obj);
} finally {
oos.close();
}
}
//对象序列化并压缩写入文件
public static void writeCompressedObject(Object obj, File file) throws FileNotFoundException,
IOException {
if (obj == null)
throw new NullPointerException("obj are null.");
ObjectOutputStream oos = new ObjectOutputStream(new GZIPOutputStream(new FileOutputStream(
file)));
try {
oos.writeObject(obj);
} finally {
oos.close();
}
}
//从文件读取序列化的对象
public static <T> T readObject(File src) throws IOException, ClassNotFoundException {
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream(src)));
return (T) ois.readObject();
} finally {
ois.close();
}
}
//从文件读取序列化并压缩的对象
public static <T> T readCompressedObject(File src) throws IOException, ClassNotFoundException {
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new GZIPInputStream(new FileInputStream(src)));
return (T) ois.readObject();
} finally {
ois.close();
}
}
如果要对序列化结果做加密,原理类似,加密算法有很多,不多说了。
以上是Java对象序列化的文件操作,下面展示与字节数组的相互转换。
public static <T extends Serializable> byte[] getBytes(T obj) throws IOException {
byte[] b = serialize(obj, false).toByteArray();
return b;
}
public static <T extends Serializable> byte[] getCompressedBytes(T obj) throws IOException {
byte[] b = serialize(obj, true).toByteArray();
return b;
}
private static <T extends Serializable> ByteArrayOutputStream serialize(T obj, boolean compressed)
throws IOException {
ByteArrayOutputStream buf = new ByteArrayOutputStream();
ObjectOutputStream oos = null;
try {
if (compressed)
oos = new ObjectOutputStream(new GZIPOutputStream(buf));
else
oos = new ObjectOutputStream(buf);
oos.writeObject(obj);
} finally {
if (oos != null)
oos.close();
}
return buf;
}
public static <T extends Serializable> T getObject(byte[] b) throws IOException,
ClassNotFoundException {
return deserialize(b, false);
}
public static <T extends Serializable> T getCompressedObject(byte[] b) throws IOException,
ClassNotFoundException {
return deserialize(b, true);
}
private static <T extends Serializable> T deserialize(byte[] data, boolean compressed)
throws IOException, ClassNotFoundException {
ByteArrayInputStream in = new ByteArrayInputStream(data);
ObjectInputStream ois = null;
try {
if (compressed)
ois = new ObjectInputStream(new GZIPInputStream(in));
else
ois = new ObjectInputStream(in);
return (T) ois.readObject();
} finally {
IOUtils.close(ois);
}
}
分享到:
相关推荐
【JAVA对象序列化保存为XML文件的工具类】 在Java编程中,对象序列化是一种将对象的状态转换为字节流的过程,以便可以存储或在网络上传输。而在反序列化时,这个字节流又可以恢复为原来的对象。Java提供了一个方便...
Java对象序列化是一种将Java对象转换为...总之,Java对象序列化是一个强大且实用的功能,它在数据持久化、网络通信等多个场景下都有广泛的应用。理解并掌握序列化机制,对于开发Java应用程序尤其是分布式系统至关重要。
序列化的过程就是对象写入字节流和从字节流中读取对象。将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其...对象序列化问题在网络编程中并不是最激动人心的课题,但却相当重要,具有许多实用意义。
Java序列化是将Java对象转换为字节流的过程,以便可以存储在磁盘上或通过网络进行传输。这个过程对于持久化对象数据、跨进程通信和在网络上传输对象非常有用。在Java中,序列化是通过实现`Serializable`接口来完成的...
Java反序列化是一种将已序列化的对象状态转换回对象的过程,通常用于持久化数据或在网络间传输对象。然而,这个过程也可能带来安全风险,因为恶意用户可以构造特殊的序列化数据来执行任意代码,这就是所谓的Java反序...
1. **对象序列化**: - 创建可序列化的类:首先,你需要定义一个类,并且在类声明中加入`implements Serializable`,例如: ```java public class MySerializableClass implements Serializable { // 类的属性 ...
Java反序列化是一种将已序列化的对象状态转换回对象的过程,通常用于持久化数据或在网络间传输对象。在Java中,这一过程涉及到`java.io.ObjectInputStream`类,它能够读取由`java.io.ObjectOutputStream`写入的字节...
2. **对象持久化**:为了将内存中的对象状态保存到磁盘上,以备后续使用,也需要将对象序列化。 3. **对象复制**:在某些情况下,需要创建对象的精确副本,序列化是实现这一目的的有效手段之一。 #### Java序列化的...
// 将对象序列化到文件 serializeObject(person, "person.ser"); // 从文件中反序列化对象 Person deserializedPerson = deserializeObject("person.ser"); // 打印反序列化后的对象 System.out.println(...
- **Java-Deserialization-Cheat-Sheet**:提供了一系列关于Java反序列化的实用指南和技巧汇总。 #### 四、总结 通过深入分析Fastjson和Weblogic的经典案例,我们可以看到,虽然反序列化技术在实际应用中带来了...
Java反序列化漏洞的产生原理主要是在对象反序列化过程中,由于程序对输入数据控制不严,可能会产生非预期的对象,进而可能带来任意代码执行的问题。攻击者可以利用这一漏洞,通过精心构造的数据序列化后,由应用程序...
1. **对象序列化**: 这个方法将一个Java对象转换为字节数组,可以用于存储到文件或数据库的Blob字段。实现方式通常是使用`ObjectOutputStream`,它能处理任何实现了`Serializable`接口的对象,并将其状态写入流中。 ...
Java反序列化是Java编程语言中的一个特性,允许将对象的状态转换为字节流,然后在需要时恢复这些状态。这个过程通常用于持久化对象,网络传输或在不同应用程序之间共享数据。然而,由于设计上的漏洞,反序列化也可能...
这会将对象序列化并发送到服务器。 ```java Socket socket = new Socket(serverAddress, serverPort); ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream()); out.writeObject(message); ...
java 序列化 对象 Serializable 写着玩的Demo 简单 实用
2. commons-lang3-3.3.2.jar:Apache Commons Lang库提供了许多实用的Java语言功能,包括序列化和反序列化的辅助工具,如`SerializationUtils`类,可用于简化对象的序列化和反序列化操作。 3. commons-beanutils-...
总结,Android序列化对象存储到SharedPreferences是一种实用技巧,它结合了Java序列化和Android的SharedPreferences机制,为开发者提供了在应用间保存简单对象的便捷方式。然而,由于SharedPreferences的局限性,...
序列化是将Java对象转换为可存储或传输的形式(如字节序列、JSON字符串或XML字符串),而反序列化则是这一过程的逆向操作。在许多应用场景中,如远程过程调用(RPC)或HTTP请求参数处理时,反序列化操作频繁出现。例如...
java序列化反序列化 可以将一个对象保存起来哦,哈哈,很实用,别忘了实现序列化接口
在`TimeDemo1`这个示例中,可能包含了具体的Java代码实现,例如创建一个时间序列类,定义预测方法,以及一个主程序来测试和展示预测结果。你可以通过阅读和理解这段代码来加深对时间序列预测的理解,并将其应用到...