シリアライズとデシリアライズ

オブジェクトのシリアライズ、デシリアライズを行う。

import java.io.*;

/**
 * 制御文字を含まない文字列によるシリアライズを行う。
 * 
 * シリアライズされたデータをASCIIのうち制御文字でないもの(0x20〜0x7E)だけで
 * 構成される文字列に変換、またはその逆を行う。
 * 制御文字は1バイトごとに、バイト値の16進数表記文字列を
 * <code>[</code>と<code>]</code>で囲んだ4バイトに変換される。
 */
public final class StringSerializer {

	private static final char S = '[';
	private static final char E = ']';

	/**
	 * 直列化する。
	 * @param object 直列化するオブジェクト
	 * @return 直列化された文字列
	 */
	public static String serialize(Object object) {
		ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
		try {
			ObjectOutputStream os = new ObjectOutputStream(byteArray);
			try {
				os.writeObject(object);
			} finally {
				os.close();
			}
		} catch (IOException ex) {
			throw new RuntimeException(ex.toString());
		}
		byte[] bytes = byteArray.toByteArray();
		StringBuffer buffer = new StringBuffer();
		for (int i = 0; i < bytes.length; i++) {
			int a = bytes[i] & 0xFF;
			if (a < ' ' || a > '~' || a == S || a == E) {
				buffer.append(S);
				buffer.append(toHexString(bytes[i]));
				buffer.append(E);
			} else {
				buffer.append((char)a);
			}
		}
		return buffer.toString();
	}

	/**
	 * シリアライズされた文字列からオブジェクトを復元する。
	 * @param string シリアライズされた文字列
	 * @return 復元されたオブジェクト
	 */
	public static Object deserialize(String string)  {

		Object obj = null;
		try {
			ByteArrayOutputStream os = new ByteArrayOutputStream();
			try {
				for (int i = 0, n = string.length(); i < n; i++) {
					char c = (char)string.charAt(i);
					if (c == S) {
						String hex = string.substring(i + 1, i + 3);
						os.write(Integer.parseInt(hex, 16));
						i += 3;
					} else {
						os.write(c);
					}
				}
			} finally {
				os.close();
			}
			ObjectInputStream is = new ObjectInputStream(new ByteArrayInputStream(os.toByteArray()));
			try {
				obj = is.readObject();
			} catch (ClassNotFoundException e){
			} finally {
				is.close();
			}
		} catch (IOException ex) {
		}

		return obj;
	}

	/**
	 * バイト値を16進数表記にする。
	 * @param b バイト値
	 * @return 16進数表記
	 */
	private static String toHexString(byte b) {
		final String chars = "0123456789ABCDEF";
		int lo = b & 0xF;
		int hi = b >> 4 & 0xF;
		return new String(new char[]{chars.charAt(hi), chars.charAt(lo)});
	}
}
package example.test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.codec.binary.Base64;

public class TestBeanSerialize {

	/**
	 * @param args
	 * @throws IOException 
	 * @throws ClassNotFoundException 
	 */
	public static void main(String[] args) throws IOException, ClassNotFoundException {

		// Beanを生成
		TestBeans bean = makeBean();

		// 文字列にシリアライズ
		String beanStr = serialize(bean);

		// Beanを復元
		TestBeans bean2 = (TestBeans)deSerialize(beanStr);

		// 復元されたBeanの内容を表示
		System.out.println("var1="+bean2.getVar1());
		System.out.println("var2="+bean2.getVar2());
		List list2 = bean2.getDetail();
		for (int i = 0; i < list2.size(); i++) {
			Object detailObj = list2.get(i);
			TestBeans.Detail detail2 = (TestBeans.Detail)detailObj;
			System.out.println("detail["+i+"].subvar1="+detail2.getSubvar1());
			System.out.println("detail["+i+"].subvar2="+detail2.getSubVar2());
		}
	}

	public static TestBeans makeBean(){

		TestBeans bean = new TestBeans();
		bean.setVar1("あいうえお");
		bean.setVar2("かきくけこ");

		List list = new ArrayList();
		TestBeans.Detail detail = bean.new Detail();
		detail.setSubvar1("さしすせそ");
		detail.setSubVar2("たちつてと");
		list.add(detail);
		bean.setDetail(list);

		return bean;
	}

	public static String serialize(Object bean) throws IOException{

		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
		ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
		try {
			objectOutputStream.writeObject(bean);
			ByteArrayOutputStream byteArrayOutputStream = (ByteArrayOutputStream)outputStream;
			byte[] encoded = Base64.encodeBase64(byteArrayOutputStream.toByteArray());
			return URLEncoder.encode(new String(encoded, "UTF-8"), "UTF-8");
		} catch (Exception e){
		} finally {
			objectOutputStream.close();
			outputStream.close();
		}
		return null;
	}

	public static Object deSerialize(String str) throws IOException, ClassNotFoundException{

		byte[] decode = Base64.decodeBase64(URLDecoder.decode(str, "UTF-8").getBytes("UTF-8"));
		ObjectInputStream objectInputStream = new ObjectInputStream(new ByteArrayInputStream(decode));

		return objectInputStream.readObject();
	}
}

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-06-11 (木) 00:48:51 (4240d)