Serializableインターフェースを用いて、インスタンスを送受信する

PythonのPickleモジュールについて学んだので、ついでにJavaの場合を調べてみた。

JavaではSerializableインターフェースというのを継承したクラスであれば、そのインスタンスをバイトストリーム化し、ソケットなどにも書き込めるようだ。簡単な通信テストのため、SerializeServer、SerializeClient、送受信するTransDataクラスを作成した。

—–



TranData.java

import java.io.*;
public class TransData implements Serializable {
private int num1;
private int num2;
private String str1;
private String str2;
TransData (int num1, int num2, String str1, String str2) {
this.num1 = num1;
this.num2 = num2;
this.str1 = str1;
this.str2 = str2;
}
public void displayData() {
System.out.println("num1 = " + this.num1);
System.out.println("num2 = " + this.num2);
System.out.println("str1 = " + this.str1);
System.out.println("str2 = " + this.str2);
}
}

SerializeClient.java

import java.io.*;
import java.net.*;
public class SerializeClient {
public static void main(String[] args) {
String server = "localhost";
int port = 23000;
TransData tData = new TransData(123,987,"abcd","XYZ");
try {
Socket socket = new Socket(server, port);
ObjectOutputStream outObject
= new ObjectOutputStream(socket.getOutputStream());
outObject.writeObject(tData);
} catch (Exception ex) {
System.err.println("Eception raised!");
}
}
}

SerializeServer.java

import java.io.*;
import java.net.*;
public class SerializeServer {
public static void main(String[] args) {
int port = 23000;
try {
ServerSocket servsock = new ServerSocket(port);
System.out.println("Wait for client program...");
Socket socket = servsock.accept();
ObjectInputStream inObject = new ObjectInputStream(socket.getInputStream());
TransData tData = (TransData)inObject.readObject();
tData.displayData();
} catch (Exception ex) {
System.err.println("Exception raised at SerializeServer!");
}
}
}

サーバ側を実行してからクライアント側を実行すると、クライアント側で定義したはずのインスタンスの属性が、サーバ側でも使用できることが分かると思う。

さて通信の際には送るバイトストリームのサイズが分かっていた方が色々と便利だが、以下によるとJavaでインスタンスオブジェクトのサイズを知るのは中々困難だったようだ。J2SDK1.4で登場したAPIというのはなんて名前だろう。ちょっと調べてみよう。

minghaiの日記 : Javaのオブジェクトサイズの測り方、sizeof

またオブジェクトのサイズを測るAPIがJ2SDK1.4までは存在しなかったのでオブジェクトのサイズは重要な割りに謎だった。

特にOutOfMemoryを頻出するJ2EE開発者には咽喉から手が出るくらい欲しい機能であったと思う。*1

以下のサイトも参考になりました。

Javaの道: 入出力(7.オブジェクトのシリアライズ)