3

私は C++ サーバーとインターフェイスしているので、ソケット経由で送信する XML 文字列にオブジェクトをデシリアライズ/シリアル化することにしました。

サーバー側ではスペースがかなり限られているため、大きなライブラリをインストールできないため、カスタムライブラリを使用できません。そのため、コードはできるだけ小さくする必要があります。

これまでのところ、リフレクションを介してオブジェクトをシリアル化する最初のバージョンを作成しましたが、これは非常に簡単でした。現在は と しか使っていませintStringが、これを土台にして後から伸ばしていきたいので、なるべく下地を整えたいと思います。

XML にシリアル化すると、値はもちろん文字列表現になります (これがどのように見えるかの例です)。

<serializable classname="client.ServerTask">
    <member classname="int" isnull="false" name="mTaskId" primitive="true">
        <value>
            <![CDATA[35]]>
        </value>
    </member>
    <member classname="java.lang.String" isnull="false" name="mName" primitive="false">
        <value>
            <![CDATA[TestServer]]>
        </value>
    </member>
    <member classname="int" isnull="false" name="mPID" primitive="true">
        <value>
            <![CDATA[512]]>
        </value>
    </member>
    <member classname="int" isnull="false" name="mStatus" primitive="true">
        <value>
            <![CDATA[32768]]>
        </value>
    </member>
</serializable>

今、逆シリアル化を実装しようとしていますが、値を文字列から実際の値に戻すという問題に直面しています。

プリミティブと文字列クラスの場合、これは些細なことですが、カスタム クラスについては後でどうすればよいのでしょうか。

私は、メンバークラスに再帰的に降りると、それはずっとプリミティブになるはずだと思っていましたか、それとも間違っていますか? プリミティブでも文字列でもないメンバーとサブクラスを再帰的にシリアライズできるようにシリアライズを設定しました。

私は何かを見逃していますか、それとも私の理解は正しいですか? このようにすると、複雑なクラスも適切にデシリアライズできますか?

現在、最初のステップはストレートで単純なクラスのみを逆シリアル化することであるため、参照の問題は無視しています。

4

2 に答える 2

2

これに対する標準的な解決策は、JDK 1.6 から Java SE の一部となっているJAXBです。

特に、注釈を使用したマッピングの構成をサポートしています (または、適切なデフォルト値に依存することもできます)。これは、外部 XML ファイルよりもはるかに冗長であり、XML スキーマからマップされたクラスを導出したり、マップされたスキーマからスキーマを導出したりできます。クラス。また、XML スキーマに対してドキュメントを簡単に検証することもできます。

さらに、使用している XML が SOAP Web サービスの場合、JAX-WS は JAXB に基づいて構築され、WSDL (または注釈付きインターフェースからの WSDL) からインターフェースを作成し、マーシャリングとアンマーシャリングを透過的に処理します。

于 2013-06-13T18:08:49.640 に答える