** シリアライズとデシリアライズ [#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();
}
}
}}