Java 如何序列化类?
在mongodb中插入列表时,出现了一个问题: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
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之类的东西,这是实现二进制序列化的一种更加经得起未来考验的方法。