** シリアライズとデシリアライズ [#od46b1bc]
#setlinebreak(on);

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

 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)});
 	}
 }


#mycode{{
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