1

そのため、getText() または write() メソッドを使用して Representation を String または StringWriter に変換しようとしています。表現でこのメソッドを一度しか呼び出せないようです...メソッドを再度呼び出すと、2回目の呼び出しでnullまたは空の文字列が返されます。どうしてこれなの?毎回同じものを返すと思います:

public void SomeMethod(Representation rep)
{
    String repAsString = rep.getText();  // returns valid text for example: <someXml>Hello WOrld</someXml>

    String repAsString2 = rep.getText(); // returns null...  wtf?
}

私が「間違っている」場合は、そのデータを取得する方法についての提案を受け入れます。

4

2 に答える 2

4

javadocsはこれを説明しています:

ローカルファイルや文字列などの安定したアクセス可能なソースがある場合、表現のコンテンツを数回取得できます。ネットワークソケットなどの一時的なソースを介して表現を取得する場合、そのコンテンツは1回しか取得できません。

したがって、おそらくそれはネットワークまたは同様のものから直接読み取られています。

これは、を呼び出すことで確認できますisTransient()。複数回読み取る必要がある場合は、おそらくそれを文字列に変換してから、Representationその文字列から新しい文字列を作成する必要があります。

于 2010-09-29T05:23:11.153 に答える
2

これは、一般に、getText()で要求するまで、表現は実際にはInputStreamから読み込まれず、要求すると、すべてのバイトが読み取られて文字列に変換されるためです。

これは効率のための自然な実装です。潜在的に非常に大きな文字列を作成し、その文字列を有用なもの(JSONオブジェクト、DOMツリーなど)に変換するのではなく、代わりにInputStreamで動作するようにコンバーターを作成します。その巨大な文字列を作成して読み取るためのコスト。

したがって、たとえば、大きなXMLファイルをWebサービスにPUTしている場合は、InputStreamをSAXパーサーに直接フィードできます。

(@Johnが指摘しているように、StringRepresentationはStringをラップするため、複数回読み取ることができます。ただし、Requestの表現(おそらくInputRepresentation)を読み取る必要があります。)

于 2010-09-29T05:23:46.250 に答える