これの問題は、オブジェクトをシリアル化してXMLファイルに保存し、XMLファイルから文字列を読み取り、オブジェクトを脱直しようとしているためです(Hadoop MapReduceプログラムは、JobConfを介してタスクトラッカーにオブジェクトを転送します)。
シリアル化について:
シリアル化されたデータをXMLに直接保存すると、違法な文字があるため、XMLを解析するときに解析エラーが発生しました。 XMLの指示を詳細に読んだ後、<> '"&XML PCDATAとして許可されていないことがわかりました。これらの文字を使用するには、組み込みのエンティティに置き換える必要があります。
エンティティの引用文字
<<
>>
&&&
「
''
したがって、最も直接的な方法は、それを自分で制御し、XMLファイルに書き込むときに特殊文字をエンティティ参照に変換し、読んでいるときにそれらを戻すことです。もちろん、文字列をPCDATAとしてはなくCDATAとして使用することである別の方法があります(テストなし)。
エンティティ参照を使用する方法はあまりにも面倒であり、アプリケーションXML形式を自分で指定できないため、別の方法を見つけなければなりません:base64エンコーディング。これは、ネットワーク上のデータを送信するために一般的に使用されるエンコード方法です。これらの違法なキャラクターが存在する文字をBase64エンコーディングにエンコードすると、これらの文字はありません。最も重要なことは、エンコードされたエンコーダーとデコーダーがJava API、base64encoder、およびsun.miscにあるbase64decoderで提供されていることです。このようにして、シリアル化後に取得されたバイトストリームを文字列に変換できます。また、XMLファイルに保存することもできます。
ただし、これらの2つのクラスはSunのオープンAPIではなく、コンピレーションに対する警告があります。