Tag: 序列化

是否可以使用CXF生成可序列化的类?

我正在使用Apache CXF从WSDL文件生成类,但它们不实现将对象放入JMS队列所需的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 […]

计算Java对象的字节大小

我正在计算java对象[hashmap]的大小[使用的内存]。 它包含[在运行时]不同数据类型的元素,因此[no-of-elem * size-of-element]不是一个好方法。 现在的代码是通过一系列的 if (x) do something else if (primitives) lookup size and calculate 然而,这个过程是CPU占用并且效率低下。 我正在考虑采用以下两种方法: 将对象序列化为缓冲区并获取大小。 查看java.lang.instrument以获取大小 我正在寻找任何人使用这些方法的性能,效率,缩放等经验,或者如果你知道更好的方法。 PS:这是我正在构建的后台实用程序,因此大小不需要超级准确,尽管它应该是正确的。 所以我愿意交换准确性来表现 我对深度大小不感兴趣[不会计算此对象引用的对象的大小。] 我正在寻找性能比较和理解getObjectSize()如何在内部工作..所以我不会搞砸别的东西来提高性能 谢谢

像字段添加或删除这样的类更改是否保持Serializable的向后兼容性?

我有一个关于Java序列化的问题,您可能需要修改可序列化类并保持向后兼容性。 我来自深度C#经验,所以请允许我将Java与.NET进行比较。 在我的Java场景中,我需要使用Java的运行时序列化机制序列化对象,并将二进制数据存储在永久存储中以便将来重用这些对象。 问题是 ,将来,课程可能会发生变化。 可以添加或删除字段。 我不太了解Java序列化,除了这篇关于如何在处理序列化时不用Java编程的精彩文章。 正如我想象的那样(d),serialVersionUID在Java序列化中起着关键作用,这是我需要你帮助的地方。 除了文章的例子(我知道它编码不好),当我在修改类后要求更新它时,该字段是否应该被修改? 我记得在.NET世界中,当我添加新字段时,我必须将[OptionalField]属性添加到字段以获得向后兼容性,因此CLR不会在旧的序列化数据中要求它。 此外,当我需要弃用字段时,我必须只删除公共方法而不是私有字段。 最佳序列化的准则是什么? 谢谢。 [添加]这是一个例子。 假设我有Foo课 public class Foo { private String bar; } 然后我改为: public class Foo { private String bar; private Integer eggs; } 这两个版本之间是否兼容? 如果我在编译“newFoo”时反序列化“oldFoo”,那么egg会等于null还是抛出exception? 我更喜欢第一个,显然!!

Java序列化方法

可以序列化方法吗? 因为当我查看文档时,Method类不实现Serializable。 那么还有其他选择吗?

反序列化对象与原始对象的实例相同

当我从类中实例化一个对象时,一个对象被保存在java堆中。 当我通过序列化保存对象并稍后反序列化对象时,我是否正确理解该对象现在将具有新的堆地址但仍将是该类的EXACT SAME实例。

如何确保文件已成功写入?

我正在为Java中的图形应用程序添加自动保存function。 应用程序定期自动保存当前文档,并在退出时自动保存。 当用户启动应用程序时,将重新加载自动保存文件。 如果自动保存文件以任何方式损坏(我假设文件处于保存状态时断电会这样做吗?),用户将失去工作。 如何防止这种情况并尽我所能保证自动保存文档处于一致状态? 更复杂的是,要自动保存文档,我需要保存一个.xml文件和几个.png文件。 此外,.png保存发生在JNI上的C代码中。 我当前的策略是使用扩展名.png.tmp编写每个.png,编写扩展名为.xml.tmp的.xml文件,然后重命名每个文件以删除.tmp部分,将.xml保留到最后。 在启动时,我只加载自动保存文档,如果我能找到.xml文件并忽略.xml.tmp文件。 在重命名新文档的.xml.tmp文件之前,我也不会删除以前的自动保存文档。 我想我对你写入磁盘时会发生什么的了解很少。 我知道在使用文件时,您可以拥有软件读/写缓冲区,以及操作系统和硬件缓冲区,并且所有这些都需要刷新。 我很困惑如何确切地知道什么东西真的被写入磁盘以及我可以做些什么来保护自己。 重命名操作是否可以确保刷新缓冲区?

是否可以在没有外部类的情况下序列化匿名类?

我在网上进行了一项小型研究并审查了该网站上的相关主题,但答案是矛盾的:有些人说这是不可能的,有些人说这是可能的,但很危险。 目标是将匿名类的对象作为RMI方法的参数传递。 由于RMI要求,此类必须是可序列化的。 这没问题,很容易使类Serializable。 但我们知道内部类的实例包含对外部类的引用(而匿名类是内部类)。 因此,当我们序列化内部类的实例时,外部类的实例被序列化以及字段。 这里是问题出现的地方:外部类不可序列化,更重要的是 – 我不想序列化它。 我想要做的只是发送匿名类的实例。 简单示例 – 这是一个RMI服务,其方法接受Runnable: public interface RPCService { Object call(SerializableRunnable runnable); } 以下是我想要调用该方法的方法 void call() { myRpcService.call(new SerializableRunnable() { @Override public Object run { System.out.println(“It worked!”); } } } 正如您所看到的,我想要做的是向另一方发送“操作” – 系统A描述应该在系统B上运行的代码。这就像用Java发送脚本一样。 如果可能的话,我可以很容易地看到一些危险的后果:例如,如果我们从Runnable访问字段或捕获外部类的最终变量 – 我们将遇到麻烦,因为调用者实例不存在。 另一方面,如果我在Runnable中使用安全代码(编译器可以检查它),那么我没有看到禁止此操作的原因。 因此,如果有人知道,如何在匿名类中正确覆盖writeObject()和readObject()方法或如何引用外部类transient或解释为什么在java中不可能,它将非常有用。 UPD另一个需要考虑的重要事项:外部类不存在于将执行该方法的环境中(系统B),这就是为什么应该完全排除有关它的信息以避免NoClassDefFoundError 。

XMLEncoder和XStream的相对优势是什么?

假设我想在XML中存储许多小配置对象,我不太关心格式。 内置到JDK中的XMLDecoder类可以工作,从我听到的, XStream以类似的方式工作。 每个图书馆有哪些优势?

HashMap可序列化

HashMap实现了Serializable接口; 所以它可以序列化。 我查看了HashMap的实现,并将Entry []表标记为瞬态。 由于Entry []表是存储Map的全部内容的表,如果无法序列​​化,那么在反序列化过程中如何构造Map?