Java对象序列化成字符串和反序列化

1、序列化:序列化后保存在一个字符串变量中

package com.lxh.ser.test;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

public class SerializeTest {

	private static final String TEMP_ENCODING = "ISO-8859-1";
	private static final String DEFAULT_ENCODING = "UTF-8";

	public static void main(String[] args) throws IOException {
		List list = new ArrayList();
		list.add("abc");
		list.add("ABC");
		System.out.println(writeToStr(list));
	}
	/**
	 * 将序列化的字符串反序列化成对象
	 * @param serStr 系列化的字符串
	 * @return Object 反序列化后得到原始的对象
	 * @throws IOException
	 */
	public static String writeToStr(Object obj) throws IOException {
		// 此类实现了一个输出流,其中的数据被写入一个 byte 数组。
		// 缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
		// 专用于java对象序列化,将对象进行序列化
		ObjectOutputStream objectOutputStream = null;
		String serStr = null;
		try {
			objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
			objectOutputStream.writeObject(obj);
			serStr = byteArrayOutputStream.toString(TEMP_ENCODING);
			serStr = java.net.URLEncoder.encode(serStr, DEFAULT_ENCODING);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			objectOutputStream.close();
		}
		return serStr;
	}
}


2、反序列化:将一个序列化后的字符串反序列化为原有对象

package com.lxh.ser.test;


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;


public class SerializeTest {

	private static final String TEMP_ENCODING = "ISO-8859-1";
	private static final String DEFAULT_ENCODING = "UTF-8";


	public static void main(String[] args) throws IOException {
		List list = new ArrayList();
		list.add("abc");
		list.add("ABC");
		String serStr = writeToStr(list);
		System.out.println(serStr);
		
		List deList = (List) deserializeFromStr(serStr);
		System.out.println(deList.get(0) + "  " + deList.get(1));
	}


	/**
	 * 将序列化的字符串反序列化成对象
	 * @param serStr 系列化的字符串
	 * @return Object 反序列化后得到原始的对象
	 * @throws IOException
	 */
	public static Object deserializeFromStr(String serStr) throws IOException {
		ByteArrayInputStream byteArrayInputStream = null;
		ObjectInputStream objectInputStream = null;
		try {
			String deserStr = java.net.URLDecoder.decode(serStr, DEFAULT_ENCODING);
			byteArrayInputStream = new ByteArrayInputStream(deserStr.getBytes(TEMP_ENCODING));  
			objectInputStream = new ObjectInputStream(byteArrayInputStream);   
			return objectInputStream.readObject();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			objectInputStream.close();
			byteArrayInputStream.close();
		}
		return null;
	}
	
	/**
	 * 将对象序列化成字符串
	 * @param obj 需要进行序列化的对象
	 * @return String 把对象序列化成字符串
	 * @throws IOException
	 */
	public static String writeToStr(Object obj) throws IOException {
		// 此类实现了一个输出流,其中的数据被写入一个 byte 数组。
		// 缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
		// 专用于java对象序列化,将对象进行序列化
		ObjectOutputStream objectOutputStream = null;
		String serStr = null;
		try {
			objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
			objectOutputStream.writeObject(obj);
			serStr = byteArrayOutputStream.toString(TEMP_ENCODING);
			serStr = java.net.URLEncoder.encode(serStr, DEFAULT_ENCODING);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			objectOutputStream.close();
			byteArrayOutputStream.close();
		}
		return serStr;
	}
}


你可能感兴趣的:(Java基础)