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

                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才行,否者的话会编译不通过。

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值