10

List を mongodb に挿入すると、問題が発生します。

Exception in thread "main" java.lang.IllegalArgumentException: can't serialize class mongodb.Person
    at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:234)
    at org.bson.BasicBSONEncoder.putIterable(BasicBSONEncoder.java:259)
    at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:198)
    at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:140)
    at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:86)
    at com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:27)
    at com.mongodb.OutMessage.putObject(OutMessage.java:142)
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:252)
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:211)
    at com.mongodb.DBCollection.insert(DBCollection.java:57)
    at com.mongodb.DBCollection.insert(DBCollection.java:87)
    at com.mongodb.DBCollection.save(DBCollection.java:716)
    at com.mongodb.DBCollection.save(DBCollection.java:691)
    at mongodb.MongoDB.main(MongoDB.java:45)

クラス Person は次のように定義されます。

class Person{
    private String name;
    public Person(String name){
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

プログラムは次のとおりです。

        DBCollection coll = db.getCollection("test");
        DBObject record = new BasicDBObject();
        List<Person> persons= new ArrayList<Person>();
        persons.add(new Person("Jack"));
        record.put("person", persons);
        coll.save(record);

グーグルからの答えが見つからないので、助けてください。

4

8 に答える 8

7

Person クラスにSerializableインターフェイスを実装するだけです。

serialVersionUIDまた、クラスでa を定義するとよいでしょう。

私の知る限り、JavaでPOJOクラスを作成する際、ストリームを介して転送される場合、クラスはシリアライズ可能である必要があり、デフォルトのコンストラクターがあり、getterおよびsetterメソッドを使用してプロパティ/フィールドにアクセスできます。

これを読むことに興味があるかもしれません: Java Serialization API の秘密を発見する

于 2012-01-05T06:21:41.070 に答える
1

mongodb を使用しているときに同じ例外が発生しました。問題のあるクラスをシリアライズ可能にしようとしましたが、問題は解決しませんでした。

以下は私のために働いたものです。クラスを拡張して BasicDBObject の子にします。もちろん、これは問題が MongoDB によって引き起こされた場合にのみ機能します。

extends BasicDBObject 

元のソース

http://techidiocy.com/cant-serialize-class-mongodb-illegal-argument-exception/#comment-1298

于 2015-04-06T10:43:12.150 に答える
0

これは、次のコードを使用して実現できます。

import com.google.gson.annotations.Expose;
import com.mongodb.ReflectionDBObject;

class PersonList extends ReflectionDBObject {
    // person property
    @Expose public java.util.List<Person> person;
}

mongodb コードで、次のように Person リストをシリアル化できます。

....
PersonList personList = new PersonList();
personList.person = new ArrayList<>();
// add persons to the list
....
....
record.put("personsList", personList);
....
// rest of your code
于 2016-03-15T17:08:54.900 に答える
0

クラス Person はjava.io.Serializableインターフェイスを実装する必要があります。

class Person implements Serializable

于 2012-01-05T06:22:32.630 に答える
0

クラスPerson定義をimplements Serializableシリアル化するには、次のようにする必要があります。

class Person implements Serializable {
   //Rest here
}

Java オブジェクトのシリアライゼーションに関する便利なリンクを次に示します: LinkLink

于 2012-01-05T06:22:38.743 に答える
0

ここでの問題は、「シリアライズ可能な実装」ではありません。問題は、オブジェクトが DBObject で変換されないことです。

考えられる解決策:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.mongodb.*;

....

ObjectMapper mapper = new ObjectMapper();
DBObject dboJack = mapper.convertValue(new Person("Jack"), BasicDBObject.class);
...
于 2015-01-02T16:20:16.643 に答える
-1

まず、クラスをシリアライズ可能にする理由を知っておく必要があります。ネットワーク上のオブジェクトをファイル、データベース、ネットワーク、プロセス、またはその他のシステムに移動したいときはいつでも。Javaの単純な実装で。Serializable インターフェースを実装するだけです。

于 2012-01-05T06:30:27.030 に答える