Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何序列化类?_Java_Mongodb_Mongo Java - Fatal编程技术网

Java 如何序列化类?

Java 如何序列化类?,java,mongodb,mongo-java,Java,Mongodb,Mongo Java,在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(Basic

在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)
该类人员的定义如下:

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);
DBCollection coll=db.getCollection(“测试”);
DBObject记录=新的BasicDBObject();
List persons=new ArrayList();
人员。添加(新人员(“杰克”);
记录。放置(“人”,人);
coll.save(记录);
我无法从google找到答案,所以请帮助我。

只需在Person类中实现接口

另外,在类中定义
serialVersionUID
也很好

另外,在java中创建POJO类时,如果该类要通过某个流进行传输,则该类应该是可序列化的,并且具有默认构造函数,并且允许使用getter和setter方法访问属性/字段


您可能对阅读以下内容感兴趣:

类人员应该实现
java.io.Serializable
接口


class Person implements Serializable

您的
Person
类定义需要有
implements Serializable
才能序列化,例如:

class Person implements Serializable {
   //Rest here
}

下面是一些关于Java对象序列化的有用链接:,。

首先,您应该知道为什么要使类可序列化? 当您想将网络上的对象移动到文件、数据库、网络、进程或任何其他系统时。 在java中实现简单。
只需实现可序列化接口。

以下是使Employee对象序列化的代码示例:

public class Employee implements Serializable {

    private int empId;
    private String name;

    public int getEmpId() {
        return empId;
    }

    public String getName() {
        return name;
    }

    public void setEmpId(int empId) {
        this.empId = empId;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "EMployee id : " + empId + "  \nEmployee Name : " + name;
    }
}

//Another Main Class
public class Main{
    public static void main(String[] args) 
        throws FileNotFoundException, IOException, ClassNotFoundException {

        String filename = "data.txt";
        Employee e = new Employee();
        e.setEmpId(101);
        e.setName("Yasir Shabbir");

        FileOutputStream fos = null;
        ObjectOutputStream out = null;

        fos = new FileOutputStream(filename);
        out = new ObjectOutputStream(fos);
        out.writeObject(e);

        out.close();

        // Now to read the object from file
        // save the object to file
        FileInputStream fis = null;
        ObjectInputStream in = null;

        fis = new FileInputStream(filename);
        in = new ObjectInputStream(fis);
        e = (Employee) in.readObject();
        in.close();

        System.out.println(e.toString());
    }
}
这里的问题不在于“实现可序列化”。 问题是对象没有在DBObject中转换

可能的解决办法:

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

....

ObjectMapper mapper = new ObjectMapper();
DBObject dboJack = mapper.convertValue(new Person("Jack"), BasicDBObject.class);
...

我在使用mongodb时也遇到了同样的异常。我试图使有问题的类可序列化,但这并没有解决我的问题

以下是对我有效的方法。 将该类扩展为BasicDBObject的子类。当然,只有当问题是由MongoDB引起时,这才有效

extends BasicDBObject 
原始来源


您可以通过使用以下代码来实现这一点:

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

class PersonList extends ReflectionDBObject {
    // person property
    @Expose public java.util.List<Person> person;
}
import com.google.gson.annotations.Expose;
导入com.mongodb.ReflectionDBObject;
类PersonList扩展ReflectionDBObject{
//人身财产
@公开公共java.util.List person;
}
现在,在mongodb代码中,您可以按如下顺序序列化人员列表

....
PersonList personList = new PersonList();
personList.person = new ArrayList<>();
// add persons to the list
....
....
record.put("personsList", personList);
....
// rest of your code
。。。。
PersonList PersonList=新PersonList();
personList.person=新的ArrayList();
//将人员添加到列表中
....
....
记录。放置(“个人列表”,个人列表);
....
//代码的其余部分

但是即使我实现了可序列化接口,我仍然有这个问题;类Person实现可序列化的{private String name;public Person(String name){this.name=name;}public String getName(){return name;}public void setName(String name){this.name=name;}}}@vienna:您是否遇到了相同的异常或任何其他异常?@vienna:尝试在Person类
public Person()中添加默认构造函数{}
@vienna,这是因为您只有一个构造函数,并且它接受一个参数。一个POJO类可以没有参数或基于零的参数构造函数。我建议执行Harry Joy上面所说的操作。@vienna:是的,扩展解决了问题,因为BasicDBObject它自己实现了可序列化。您是如何做到的@vienna..请帮助我同样的问题。Plz helpAn观察:MongoDB的一个好处是能够随着时间的推移改进模式,而不必使用这些新字段更新现有文档。因此,您可能希望将对象存储为文档(例如,使用名称字段等),或者如果您真的想进行二进制序列化,您可能更喜欢使用Google Protocol Buffers之类的东西,这是实现二进制序列化的一种更加经得起未来考验的方法。