java将对象或对象集合序列化成string
一、介绍
在日常java开发中,可能需要将java中的对象转化成String类型进行存储在数据库或者Redis中。自己可能很难完成这个转化的过程,所以使用以下代码工具类进行快速转化。
二、框架介绍
Kryo是一个快速高效的Java序列化框架,旨在提供快速、高效和易用的API。无论文件、数据库或网络数据Kryo都可以随时完成序列化。Kryo还可以执行自动深拷贝(克隆)、浅拷贝(克隆)。这是对象到对象的直接拷贝,非对象->字节->对象的拷贝。
三、代码介绍
1、pom文件
// 各位根据自己需求选择不同version
<dependency>
<groupId>com.esotericsoftware</groupId>
<artifactId>kryo-shaded</artifactId>
<version>4.0.1</version>
</dependency>
2、代码
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.codec.binary.Base64;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import com.esotericsoftware.kryo.serializers.CollectionSerializer;
import com.esotericsoftware.kryo.serializers.JavaSerializer;
public class SerializeUtil {
// 将对象序列化成string
public static <T extends Serializable> String serializeObject(T obj) {
Kryo kryo = new Kryo();
kryo.setReferences(false);
kryo.register(obj.getClass(), new JavaSerializer());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Output output = new Output(baos);
kryo.writeClassAndObject(output, obj);
output.flush();
output.close();
byte[] b = baos.toByteArray();
try {
baos.flush();
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
return new String(new Base64().encode(b));
}
// 将string反序列化成对象
@SuppressWarnings("unchecked")
public static <T extends Serializable> T deserializeObject(String obj, Class<T> clazz) {
Kryo kryo = new Kryo();
kryo.setReferences(false);
kryo.register(clazz, new JavaSerializer());
ByteArrayInputStream bais = new ByteArrayInputStream(new Base64().decode(obj));
Input input = new Input(bais);
return (T) kryo.readClassAndObject(input);
}
// 将对象List集合序列化成string
public static <T extends Serializable> String serializeList(List<T> obj,
Class<T> clazz) {
Kryo kryo = new Kryo();
kryo.setReferences(false);
kryo.setRegistrationRequired(true);
CollectionSerializer serializer = new CollectionSerializer();
serializer.setElementClass(clazz, new JavaSerializer());
serializer.setElementsCanBeNull(false);
kryo.register(clazz, new JavaSerializer());
kryo.register(ArrayList.class, serializer);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Output output = new Output(baos);
kryo.writeObject(output, obj);
output.flush();
output.close();
byte[] b = baos.toByteArray();
try {
baos.flush();
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
return new String(new Base64().encode(b));
}
// 将string反序列化成对象List集合
@SuppressWarnings("unchecked")
public static <T extends Serializable> List<T> deserializeList(String obj,
Class<T> clazz) {
Kryo kryo = new Kryo();
kryo.setReferences(false);
kryo.setRegistrationRequired(true);
CollectionSerializer serializer = new CollectionSerializer();
serializer.setElementClass(clazz, new JavaSerializer());
serializer.setElementsCanBeNull(false);
kryo.register(clazz, new JavaSerializer());
kryo.register(ArrayList.class, serializer);
ByteArrayInputStream bais = new ByteArrayInputStream(
new Base64().decode(obj));
Input input = new Input(bais);
return (List<T>) kryo.readObject(input, ArrayList.class, serializer);
}
}
3、使用
// QuestionDto 自定义的类
// 序列化
String value = SerializeUtil.serializeList(listQuestionDto, QuestionDto.class);
// 反序列化
List<QuestionDto> = SerializeUtil.deserializeList(value, QuestionDto.class);
4、注意事项:
在步骤3中,需要序列化的对象必须是实现序列化接口的也就是说实体类需要 implements Serializable才行,否者的话会编译不通过。