Javaで特殊なシリアライズ、デシリアライズ(ObjectInputStream#readFully)以下のようなコードではまった。0x121212121212L;}クラスBarのundumpはファクトリメソッドで、与えられたダンプデータからBarのインスタンスを復元するものとする。Serializableにしておけよと思うが、そういうような仕組みになっている既存のやつだからしょうがない。barbarのNullPointerExceptionだ。readObjectで読み込んだbaがおかしいらしい。ところが、この後にデシリアライズするオブジェクトは正しく復元されている。ObjectInputStreamの読み込みポインタが途中でずれているという問題ではない。結局、現場検証しかない。順番にいろいろログを仕込んで最終的に、次のがビンゴだった。resultLen);読み込んだサイズが読むべきサイズより小さい。????で、あらためてObjectInputStreamのリファレンスを見て、以下のように修正。in.readFully(ba);これで正しく処理できるようになった。これってすさまじく愚かな仕様に見える。readしたいことが普通にあるからじゃないでしょうか。改行までくるまで処理したいという場合には、何バイト入力待てば良いか分からないわけですが、だからといって1バイトずつ入力するのはシステムコールオーバーヘッドが大きいわけで。writeが欲しいことは厳密に言うとあるんですが、こちらは、カーネル内にバッファがあり、バッファサイズまでは止まらずに書けてしまいますから、、readに比べるとやや必要性は低いです。対称性という意味ではあった方がいいんでしょうけど。その場合はread/writeの動作をfullyにして、parital読み書きを長いメソッド名にした方が良さそうです。20:05)確かにディスクはともかくネットワークまで含めるとありな気はするのですが、ものがオブジェクト復元用だからなぁ。byte[]を使った時点で負けなのでしょう。