1

私はGWTを学んでいます。

シリアル化可能性に関するエラーが発生しました。

私の問題の簡単な説明

クラス Customproperties 内

package com.exp.shared;


import java.io.Serializable;
import java.util.List;

public class Customproperties implements Serializable  {

    private Object value;
    private List<?> values;
          // more variable

    public Customproperties() {
        // TODO Auto-generated constructor stub
    }

    public Customproperties(String propertyName, List<?>  object,
            String propertyType, boolean mulitiValued, String cardinality, Boolean required) {

        this.propertyName=propertyName;
        this.values=object;
                // more initialization
    }

    public Customproperties(String propertyName,  List<?> object, String propertyType,
            boolean multiValued) {
        this.propertyName=propertyName;
        this.values=object;
                // more initialization
    }

    public Object getValue() {
              return value;
    }
    public List<?> getValues() {
        return values;
    }
 }

classImpl の 1 つのサーバー パッケージで、Customproperties のオブジェクトを使用しています

      if (doc.getPropertyValue("cmis:objectTypeId").toString().equals("cmis:document")) {

    customproperty=new Customproperties(p.getDefinition().getDisplayName(), p.getValue(), p.getType().toString(),p.isMultiValued());
       }
else {
    customproperty=new Customproperties(p.getDefinition().getDisplayName(), p.getValues(), p.getType().toString(),p.isMultiValued(),value.getCardinality(),value.isRequired());
            }

ここで、条件 p.getValue() が Object を返す場合。else 条件では、p.getValues() は List を返します。

CustomProperties class変更するobject variableと、string完全に正常に機能します。

しかし、私はそれを変更しないとエラーが発生します。

com.exp.shared.Customproperties' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = com.exp.shared.Customproperties@1aa5344
        at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:619)

String を変更したくありません。オブジェクトを受け取りたいだけです。原因このオブジェクトは、いくつかの時間String、、、.dateint

助けてください。

4

3 に答える 3

1

RPC シリアライゼーションに関する GWT のドキュメントを読む必要があります

クラス java.lang.Object はシリアライズ可能ではないため、オブジェクト型のコレクションがネットワーク上でシリアライズされることは期待できません。

これが例外を取得する理由です。あなたが与えたコードでは、フィールド値を使用していません。クラスの両方のコンストラクターは、値リストのみを設定します。したがって、フィールド値を使用していない場合は、削除するだけで機能します。しかし、それが間違いであり、それを使用する必要があると仮定すると...

値が持つことができるさまざまなタイプをすべて知っておく必要があります。そして、intValue、dateValue、stringValue などのさまざまなフィールドを使用するか、1 つの String フィールドを使用して、オブジェクトをこのような文字列にシリアル化できます。

public class CustomProperties {
    private String value;
    private String type;

    private void setValue(Object value, String type) {
        if (value != null) {
            this.value = value.toString();
            this.type = type;
        }
    }

    private Object getValue() {
        if (value != null) {
            if ("int".equals(type)) return Integer.valueOf(value);
            elseif ("date".equals(type)) return // Parse date from value here
            elseif ("string".equals(type)) return (String) value;
            // other cases
        }
        return value;
    }

}

于 2012-05-22T16:45:26.170 に答える
0

あなたの場合、問題はおそらくList<?>. GWT は、そのリストに入れている可能性のある型を認識していないため、ソースパスで可能なすべての型をシリアル化するコードを生成する代わりに、既に必要であることがわかっているもの以外は何も生成しません。他の場所では必要のないものをそこに置こうとすると、例外が発生します。これは、そのオブジェクトをネットワーク経由で送信する予定があることを GWT に伝えていないことを示しています。

ここでの標準的なアプローチは、通常、おそらく を実装するマーカー インターフェイスを作成し、SerializableそれをList<MyModelObjects>. 次に、そこに収まるすべてのオブジェクトがそのインターフェイスを実装する必要があります。

于 2012-05-22T17:21:42.330 に答える
0

GWT では、コンテナーを宣言するときに、 のようなジェネリック型を宣言することはありませんList
のようなより具体的なタイプを常に使用してくださいArrayList

于 2012-05-22T16:19:40.970 に答える