java将对象或对象集合序列化成string

                java将对象或对象集合序列化成string

一、介绍

在日常java开发中,可能需要将java中的对象转化成String类型进行存储在数据库或者Redis中。自己可能很难完成这个转化的过程,所以使用以下代码工具类进行快速转化。

二、框架介绍

Kryo是一个快速高效的Java序列化框架,旨在提供快速、高效和易用的API。无论文件、数据库或网络数据Kryo都可以随时完成序列化。Kryo还可以执行自动深拷贝(克隆)、浅拷贝(克隆)。这是对象到对象的直接拷贝,非对象->字节->对象的拷贝。

三、代码介绍

1、pom文件

// 各位根据自己需求选择不同version

	com.esotericsoftware
	kryo-shaded
	4.0.1

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  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 deserializeObject(String obj, Class 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  String serializeList(List obj,
	            Class 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  List deserializeList(String obj,
	            Class 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) kryo.readObject(input, ArrayList.class, serializer);
	    }
}

3、使用

// QuestionDto 自定义的类
// 序列化
String value = SerializeUtil.serializeList(listQuestionDto, QuestionDto.class);
// 反序列化
List = SerializeUtil.deserializeList(value, QuestionDto.class);

4、注意事项:

在步骤3中,需要序列化的对象必须是实现序列化接口的也就是说实体类需要 implements Serializable才行,否者的话会编译不通过。

 

 

 

你可能感兴趣的:(java)