シリアライズとデシリアライズ †オブジェクトのシリアライズ、デシリアライズを行う。 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(); } } |