Tag: 序列化

避免Java反序列化中的重复对象

我有两个列表(list1和list2)包含对某些对象的引用,其中一些列表条目可能指向同一个对象。 然后,由于各种原因,我将这些列表序列化为两个单独的文件。 最后,当我反序列化列表时,我想确保我不会重新创建超出需要的对象。 换句话说,List1的某些条目仍然可以指向与List2中的某个条目相同的对象。 MyObject obj = new MyObject(); List list1 = new ArrayList(); List list2 = new ArrayList(); list1.add(obj); list2.add(obj); // serialize to file1.ser ObjectOutputStream oos = new ObjectOutputStream(…); oos.writeObject(list1); oos.close(); // serialize to file2.ser oos = new ObjectOutputStream(…); oos.writeObject(list2); oos.close(); 我认为规范的 3.4和A.2节说反序列化严格地导致了新对象的创建,但我不确定。 如果是这样,一些可能的解决方案可能涉 实现equals()和hashCode()并手动检查引用。 创建一个“容器类”来保存所有内容,然后序列化容器类。 是否有一种简单的方法可以确保在反序列化时不会复制对象? 谢谢。

为什么实现Externalizable需要一个默认的公共构造函数?

如果我们实现Serializable,我们不需要它。 为什么这个差异呢? 它与序列化的实际机制有什么关系?

eclipse中的serialVersionUID字段警告

我刚开始使用AWT并在其中创建了一个简单的程序,它工作正常,但它在eclipse中显示了一条我不明白的警告信息: 可序列化类TestGUI不声明long类型的静态最终serialVersionUID字段 我知道警告消息与AWT无关,并且没有必要发布我的整个代码,但是当我试图制作代码的SSCCE时,警告也消失了。 由于我不知道为什么会产生这个警告,所以我不知道在我的SSCCE中保留哪一部分。 因此整个代码! 我的代码是: import java.awt.Frame; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class TestGUI extends Frame { /** * @param args */ private int x = 50; private int y = 50; TestGUI(String s) { addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent we) { setVisible(false); System.exit(0); } }); addMouseListener(new […]

jacksonJSON – 反编译Commons MultiMap

我想使用JSON序列化和反序列化MultiMap(Apache Commons 4)。 要测试的代码段: MultiMap map = new MultiValueMap(); map.put(“Key 1”, “Val 11”); map.put(“Key 1”, “Val 12”); map.put(“Key 2”, “Val 21”); map.put(“Key 2”, “Val 22”); ObjectMapper mapper = new ObjectMapper(); String jsonString = mapper.writeValueAsString(map); MultiMap deserializedMap = mapper.readValue(jsonString, MultiValueMap.class); 序列化工作正常,并产生我期望的格式: {“Key 1”:[“Val 11″,”Val 12″],”Key 2”:[“Val 21″,”Val 22”]} 不幸的是,反序列化产生的结果不是它看起来的样子:在反序列化之后,Multimap在ArrayList中包含一个用于键值的ArrayList,而不是包含值的键的单个ArrayList。 由于MultiMap实现了Map接口,因此调用多映射的put()方法来添加在json字符串中找到的数组,从而产生了这个结果。 如果将新值放入非现有键,MultiMap实现本身将再次创建一个ArrayList。 有没有办法绕过这个? 感谢您的帮助!

具有复合键的地图的JSON表示

我想将以下(java)数据结构序列化为JSON: class Machine { String name; Map parts; } class PartDescriptor { String group; String id; hashCode() equals() } class Part { String group; String id; String description; String compat; … … } 什么是一Machine JSON表示? 另外( 可选 ),指向JSON到Java序列化器/反序列化器,它将支持您的表示

Spark序列化和Java序列化有什么区别?

我正在使用Spark + Yarn,我有一个我想在分布式节点上调用的服务。 当我在使用java序列化的Junit测试中“手动”序列化此服务对象时,服务的所有内部集合都被很好地序列化和反序列化: @Test public void testSerialization() { try ( ConfigurableApplicationContext contextBusiness = new ClassPathXmlApplicationContext(“spring-context.xml”); FileOutputStream fileOutputStream = new FileOutputStream(“myService.ser”); ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); ) { final MyService service = (MyService) contextBusiness.getBean(“myServiceImpl”); objectOutputStream.writeObject(service); objectOutputStream.flush(); } catch (final java.io.IOException e) { logger.error(e.getMessage(), e); } } @Test public void testDeSerialization() throws ClassNotFoundException { try ( […]

如何在登录/创建帐户程序中解决此序列化错误?

我正在编写一个简单的GUI程序,它使用来自文本文件的登录信息。 它从另一个创建用户帐户的GUI程序中获取登录信息。 我不确定如何有效地序列化这个,因为它只是我最近学到的东西。 我该怎么办? 如何解决此序列化错误,以及如何改进它并使其正常运行。 用户类: package passwordProgram; import java.util.ArrayList; import java.util.Arrays; import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.Serializable; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; import javax.swing.UIManager; public class User implements Serializable, ActionListener { public static ArrayList allUsernames = new ArrayList(); String […]

如何限制从Socket通过ObjectInputStream读取的最大大小?

有没有办法限制从java中的ObjectInputStream读取的最大缓冲区大小? 如果很明显有问题的对象是恶意巨大的,那么我想停止反序列化。 当然,有ObjectInputStream.read(byte [] buf,int off,int len),但我不想受到分配的性能损失,比如byte [1000000]。 我在这里错过了什么吗?

Java – 修改二进制序列化对象的serialVersionUID

几个月前,我将java.io.Serializable对象序列化为一个文件。 现在我需要读取内容,但从那时起serialVersionUID已经改变,现在我遇到了“类不兼容”的错误。 我知道没有数据成员发生过变化,因此唯一的障碍是serialVersionUID检查。 有没有办法禁用检查或修改二进制文件中的serialVersionUID? 澄清 这个问题假设我无法编辑源代码。 有没有办法可以破解.class文件或者破解序列化的目标文件(使用hex编辑器并在某个偏移量处更改值)?

如何在Scala中序列化函数?

我正在切断akka-persistence,并发现了对象序列化的典型问题。 我的对象(如下所示)具有基本类型和function。 我读了这个 , 这个和这个 ,但没有一个帮我制作下面的序列化。 测试工具 object SerializationUtil { def write(obj: Any): String = { val temp = Files.createTempFile(null, null).toFile val out = new ObjectOutputStream(new FileOutputStream(temp)) out.writeObject(obj) out.close() temp.deleteOnExit() temp.getAbsolutePath } def read[T](file: String) = { val in = new ObjectInputStream(new FileInputStream(new File(file))) val obj = in.readObject().asInstanceOf[T] in.close() obj } } 统计 case class […]