Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

XMLEncoderによるシリアライズ

お世話になっております。
XMLEncoderによるシリアライズでうまくXMLに出力されませんが、なにか間違っておりますでしょうか。
関数は正常終了していますがXMLファイルにプロパティの内容(id,name)が出力されません。
よろしくお願いいたします。
環境:WinXP,jre1.6.0_07,Eclipse3.4



SerializeSample ddd = new SerializeSample();
XmlWriteObjectFile( "C:\\aaaa.xml", ddd );

// XMLエンコード実行
public static void Encode( String szPath, Object objTarget )
{
    FileOutputStream fileStream = null;
    BufferedOutputStream bufferedStream = null;
    XMLEncoder xml = null;
    File file = null;
    boolean bRet;

    try
    {
        file = new File( szPath );
        if( file.exists() == false )
        {
            bRet = file.createNewFile();
            if( bRet == false ) return;
        }
        fileStream = new FileOutputStream( szPath );
        bufferedStream = new BufferedOutputStream( fileStream );
        xml = new XMLEncoder( bufferedStream );
        xml.writeObject( objTarget );
    }
    catch( Exception ex )
    {
        ex.printStackTrace();
    }
    finally
    {
        if( xml != null ) xml.close();
    }
}

// 対象クラス
public class SerializeSample
{
    private int        id;
    private String    name;
    
    public SerializeSample()
    {
        id=5;
        name="sample";
    }

    public String getName()
    {
        return name;
    }

    public void setName( String name )
    {
        this.name = name;
    }

    public int getId()
    {
        return id;
    }

    public void setId( int id )
    {
        this.id = id;
    }

    

}


// 出力されたXMLファイル
<java version="1.6.0_07" class="java.beans.XMLDecoder"> 
 <object class="SerializeSample"/> 
</java> 

10

回答

4017

閲覧

10件の回答

評価

0

失礼しました。
以下の間違いです。

SerializeSample ddd = new SerializeSample();
Encode( "C:\\aaaa.xml", ddd );

評価

0

APIドキュメントのSerializableの項を読みましょう。

インターフェースってのは、所詮、席が用意してあるってだけだからね。
親クラスと全く同じならともかく、拡張したんだったら、
自前で受付嬢を置いて、仕事のやり方を教えてあげる必要がある。

評価

0

ご回答ありがとうございます。
すみません、リファレンスを呼んでみたのですが
理解できませんでした。

一応、
public class SerializeSample implements Serializable
みたいなことはやってみましたが
結果は同じでした。

http://codezine.jp/article/detail/371?p=1
こちらのサイトにGetter、Setterと
デフォルトコンストラクタを作ればできるような
ことがかいてあるので、これでよいと思ったのですが。。。


評価

0

XMLEncoderでは、JavaBeansの規約に従う必要はないので、Serializableは読まなくていいです。

読むべきは、XMLEncoderのjavadocの以下の一文です。
>コンパクトな構造: XMLEncoder クラスは内部で冗長性削減アルゴリズムを使用するため、Bean のプロパティーのデフォルト値がストリームに書き込まれません。

要約すると、コンストラクタで設定されているデフォルト値が
変更されていないのに、その状態を出力すると出力量が多くて冗長になるから、
出力しないよということです。

上記の例で言うと、SerializeSampleのインスタンスが生成された後、XMLEncoderで出力するまでの間に、
id,nameのいずれのプロパティも変更されていないから、省略するよと。
SerializeSample ddd = new SerializeSample();
ddd.setId(100);
XmlWriteObjectFile(ddd);
とやればいいです。

それはそうと、コードの書き方もいろいろ改善したほうがいいかと思う。

評価

0

barさん、ありがとうございました。
そのような仕様があったのですね。
見事問題解決しました。

>それはそうと、コードの書き方もいろいろ改善したほうがいいかと思う。

についてですが、もしよろしければご指摘願えないでしょうか。
Javaをはじめて一週間の者で、コーディングスタイル等の情報も集めているところです。

評価

0

ぱっと見て気になったところだけですが。
個人的な意見ですので、コーディング規約で、
そう定められているのならば無視してください。

例えば、冗長なので、
boolean値 == trueやboolean値 == falseとかは書かないです。
>if( bRet == false ) 
>if( file.exists() == false )

また、javaに限らず、使用しない不要な変数を宣言しないのは、コーディングの
基本的な作法です。
>FileOutputStream fileStream = null;
>BufferedOutputStream bufferedStream = null;
>boolean bRet;

また、try-catchは極力、例外を補足したい最小限の範囲で囲った方が良いと
されていたり、メソッド名は小文字で始まる、変数名の命名方法等々は、一般
的なjavaのコーディング規約でも検索してみてください。

評価

0

ありがとうございました。
大変勉強になりました。
コーディングスタイルも見直していこうと思います。

評価

0

参考にしたいんですけど、どんなアプリケーションで使用するんですか?

評価

0

suzuki様
汎用的に使用することになるかと思います。
(設定情報の保存等)

評価

0

ありがとうございます。うっすら見えてきました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。