Tag:

Java – 反序列化InvalidClassException(无有效的构造函数)

我正在尝试序列化一个对象,然后在将其数据发送到客户端程序后反序列化它。 这是对象inheritance如何工作的一个例子。 我正在序列化和反序列化的对象是人。 生活 – >动物 – > NPC – >人 – >儿童 Living,Animal和NPC不实现Serializable。 我无法改变这三个class级。 Person和Child确实实现了Serializable。 人与生活也是抽象的阶级。 我可以将一个Person(谁是一个Child)序列化并发送它,但是当我尝试反序列化一个Person(谁是一个Child)时,我在Child上得到一个InvalidClassException,说“没有有效的构造函数”。 为什么会这样? Must Living,Animal和NPC都实现Serializable?

反序列化的工作原理如何?

据我所知,没有调用Object的序列化类的构造函数,而是第一个非序列化构造函数的no-arg构造函数。 现在考虑以下代码 public class SerializeDemo implements Serializable { private String name; int age; //default 0 public SerializeDemo(String name, boolean setAge){ this.name = name; if(setAge){ this.age = 18; } } @Override public String toString() { return “Name is ” + name + ” and age is ” + age; } public static void main(String args[]) throws […]

EJB和CDI bean序列化的最佳实践

我还没有遇到任何序列化相关的问题。 但是PMD和Findbugs发现了一系列关于序列化的潜在问题。 典型情况是注入的记录器被检测为不可序列化的。 但还有更多 – EntityManager和几个CDI bean。 我没有找到任何关于如何正确处理序列化的最佳实践。 将@Inject和@PersistenceContext注入的字段重新注入反序列化? 它们应该标记为transient吗? 或者我应该忽略/关闭代码检查? PMD建议我应该真正提供所有这些领域的访问者吗?

序列化Arraylists

现在我想知道你们是否可以帮助我将ArrayList序列化到文件中。 现在我正在从学校开始总结,但是我没有真正的编码问题。 我正在制作的是一个GUI地址簿,当用户添加地址时,它会被存储到一个arraylist中并添加到comboBox中。 这就是我在做的事情。 我要问的是你是否可以序列化Arraylists。 如果可以,你们可以教我怎么样? 或者至少给我一些教程? 非常感谢。 如果你们在回答之前需要查看代码,请告诉我,我会告诉你。 再次,谢谢你。 好的,这是我的整个代码: import java.awt.EventQueue; public class Address_Book { private JFrame frame; private JTextField newName; private JTextField newAddress; private JTextField newPhoneAddress; ArrayList test = new ArrayList(); /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { […]

反序列化问题 – java.io.StreamCorruptedException:类型代码无效:00

我正在编写一个java文件传输应用程序,我有一些麻烦的反序列化自己定义的类来自Datagramms的消息。 StackOverflow的其他主题有类似的问题,但我没有从那里找到有用的东西,所以如果我错过它,我很抱歉。 所以,类消息是: import java.io.Serializable; public class Message implements Serializable { private static final long serialVersionUID = 1L; private int segmentID; private byte[] packet; private int bytesToWrite; public Message(){ segmentID = -1; } public Message(int segmentID, byte[] packet, int bytesToWrite) { this.segmentID = segmentID; this.packet = packet; this.bytesToWrite = bytesToWrite; } public int getBytesToWrite() { […]

Java部分(de)对象序列化

假设我们有3个类: class foo { // not a singleton String s; } class bar { foo f; int i; } class baz { foo sameF; } 现在我们创建实例 foo onlyFoo = new foo(“the only one”); bar theBar = new bar(onlyFoo, 123); baz theBaz = new baz(onlyFoo); 之后我们想将它们串行存储在一个文件中。 如果我们反序列化theBaz,修改onlyFoo并再次将theBaz反序列化为该文件,theBar仍包含原始的onlyFoo,因此有两个不同版本的onlyFoo。 我想要的是我存储theBaz和theBar 而不仅仅是Foo,分别存储三个对象,一旦有人反序列化了Baz我也想给他只有.Foo。 如果他再次对已更改的onlyFoo进行反序列化,则theBaz 和 theBar将具有相同的仅修改过的对象,因此如果有人请求对象(例如theBar),则会获得包含所有引用对象(onlyFoo)的完整序列化对象,就像正常的序列化过程将返回。 我知道我必须存储对象并手动和单独保存引用,因为默认序列化无法处理此问题。 我不知道的是如何部分序列化/反序列化Java对象? 我需要将原语及其包装器与“更高”的对象分开,并分别存储这些对象。 更新 […]

序列化/反序列化机制

说,我有一个具有字段值的类X ,即 class X implements Serializable { private int value; // … } 此外,它没有显示getter和setter。 这个类是序列化的。 在反序列化时,结束同一类具有值字段,访问说明符是公共的。 此外,这个类没有getter和setter。 所以,我的问题是: 如果字段的访问说明符发生更改或者反序列化结束时类中缺少某些或所有方法,反序列化是否会失败? 在反序列化期间为字段分配值的机制是什么?

如何从文件反序列化到不同的类

我将ArrayList list序列化为一个文件,并将该文件传输到另一台机器中的另一个系统。 由于它是一个接收文件的不同系统,我没有相同的packageA.Changelog类,而是一个packageB.Changelog ,它具有完全相同的结构但在不同的包中。 当我使用时 ArrayList changelogs = (ArrayList)ois.readObject(); 从文件中读出我得到了ClassCastException 。 如何避免这种exception? 我是否需要在其他系统中创建相同的包结构才能接收列表?

如何使用jackson将自定义反序列化器添加到接口

说我有一个接口A,我想为所有类实现接口A使用自定义反序列化器,所以我使用下面的代码,但它不起作用,而CustomAserializer工作。 那么我该如何使用我的自定义反序列化器反序列化所有类实现A. 谢谢。 module.addDeserializer(A.class, new CustomADeserializer()); module.addSerializer(A.class, new CustomASerializer())

Java序列化 – Android反序列化

我尝试在Java和Android之间实现跨平台序列化。 我使用了Serializable,并将Android中的代码放在与桌面Java相同的包中。 来源:java-desktop序列化 Student student=new Student(); student.setName(“John”); student.setSurname(“Brown”); student.setNumber(776012345); try { FileOutputStream fout = new FileOutputStream(“thestudent.dat”); ObjectOutputStream oos = new ObjectOutputStream(fout); oos.writeObject(student); oos.close(); } catch (Exception e) { e.printStackTrace(); } } 来源:Android – 反序列化 File file=new File(getExternalFilesDir(null), “thestudent.dat”); try { FileInputStream fint = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(fint); Student stud=(Student) ois.readObject(); ois.close(); } […]