11

App Engine に次の Java モデル クラスがあります。

public class Xyz ... {
    @Persistent
    private Set<Long> uvw;
}

Java で空のセットuvwを使用してオブジェクトXyzを保存すると、「 null」フィールドが表示されます (appengine データストア ビューアに表示されます)。次の Python モデル クラスで定義されているように、(remote_api を介して) Python で同じオブジェクトを読み込もうとすると、次のようになります。

class Xyz(db.Model):
    uvw = db.ListProperty(int)

BadValueError: プロパティ uvw が必要です」というメッセージが表示されます。

空のuvwリストを使用して Python で同じクラスの別のオブジェクトを保存すると、データストア ビューアは「不足している」フィールドを出力します。

空のリストのストレージ処理が Java と Python で異なるようで、「互換性のない」オブジェクトにつながります。

したがって、私の質問:次のいずれかの方法はありますか:

  • Java に空のリストを「欠落」フィールドとして格納するように強制する。
  • オブジェクトをロードするときに、Python が「null」リストを空のリストとして優雅に受け入れるように強制しますか?

または、両方の言語で空のリスト フィールドを処理する方法に関するその他の提案。

回答ありがとうございます。

4

4 に答える 4

2

Python プロパティにデフォルト値を割り当てると、うまくいくはずです。

uvw = db.ListProperty(int, default=[])
于 2010-06-20T13:36:55.383 に答える
1

私は低レベルの Java API を使用しているため、おそらく私が行っていることは異なるでしょう。ただし、コレクション型のデータ構造をデータストアに保存する前に、データストアが自然に処理できるものに変換します。これには、主に String と ByteArray が含まれます。

Java アプリ エンジンが空のセットを null 値として解釈しているようです。そして、python はこの null 値を正しく読み取っていません。空のセットを文字列値「空のセット」として保存してみてください。次に、Python でデータストアがその文字列値を保持しているかどうかを確認します。存在する場合は、新しい空のセットを割り当てることができます。そうでない場合は、プロパティをセットとして読み取ることができます。

于 2010-06-16T19:23:14.533 に答える
0

Java Set の動作は、Java のコレクションが参照型であり、デフォルトで null であるためです。

空の Set を実際に作成するには、次のように宣言します。

@Persistent
private Set<Long> uvw = new HashSet<Long>();

Setまたは、右側 の他の実装を使用します。HashSetただし、最も一般的に使用されるセット型です。その他の興味深いセット タイプは、2 つのスレッド セーフなセットCopyOnWriteArraySetConcurrentSkipListSet; です。Ordered Set 型LinkedHashSetと Sorted Set 型もありTreeSetます。

于 2010-02-22T14:55:07.907 に答える
0

それはあなたに役立つかもしれません

uvw = db.ListProperty(int, default=[])

それを短くするための最もコメントの方法...

于 2018-07-15T14:16:32.880 に答える