Tag: 序列化

将许多java对象写入单个文件

如何将多个可序列化对象写入单个文件,然后在需要时读取一些对象?

如何从XSD生成实现可序列化的类?

我需要在包(.jar)中从我的XML Schema(XSD)生成许多类。 如何将这些类配置为可序列化? (我正在使用Eclipse和JAX-B)

为什么不自动生成serialVersionUID?

为什么不自动生成serialVersionUID ? 我在应用程序服务器上遇到了一个问题,显然是在缓存旧类。

为什么HashMap的哈希表标记为瞬态,尽管该类是可序列化的

我正在查看HashMap的来源。 HashMap implements Serializable 。 好的,它可以作为对象进行存储/传输。 但我发现散列表本身被标记为transient 。 我不明白。如果你把它标记为瞬态,这是不是意味着它不应该被序列化? 但所有的数据都在表格中。那为什么它是transient ? 也许我对Serializable如何工作感到困惑?

如何在不实际序列化的情况下估计Java中对象的序列化大小?

要增强群集中的消息传递,重要的是要在运行时了解消息的大小(我应该更喜欢处理本地消息还是远程消息)。 我可以找到基于java检测估计对象内存大小的框架。 我测试了classmexer,它没有接近序列化大小和sourceforge SizeOf。 在一个小的测试用例中,SizeOf错误大约10%,比序列化快10倍。 (仍然瞬态完全打破了估计,因为例如ArrayList是瞬态的,但被序列化为数组,修补SizeOf并不容易。但我可以忍受这种情况) 另一方面,10%的误差和10%的误差似乎不太好。 任何想法我怎么能做得更好? 更新:我还测试了ObjectSize( http://sourceforge.net/projects/objectsize-java )。 结果似乎只适用于非inheritance对象:(

为什么在写入ObjectOutputStream时必须首先调用defaultWriteObject函数?

当我Thinking in java阅读Thinking in java的Serializable接口时,有一句话说: 如果使用默认机制来编写对象的非瞬态部分,则必须调用defaultWriteObject()作为writeObject()中的第一个操作,并将defaultReadObject()作为readObject()中的第一个操作。 在docs.oracle.com 5.6.2中 : 添加writeObject / readObject方法 – 如果读取流的版本具有这些方法,则通常需要readObject读取默认序列化写入流所需的数据。 它应该在读取任何可选数据之前先调用defaultReadObject。 期望writeObject方法像往常一样调用defaultWriteObject来写入所需的数据,然后可以编写可选数据。 所以,如果我不首先调用defaultWriteObject ,并且如果我在该调用之前写了其他内容,那么会有任何问题吗? 我试过了,但似乎它在我的例子中仍然运作良好。 那么如果有任何问题,它会在什么条件下发生?

为什么Java的基于价值的类不能被序列化?

从版本8开始,Java具有基于值的类的概念。 这是为了准备将来很可能允许定义值类型的未来版本。 这两个定义/描述都提到了序列化(由我添加的粗体): 关于现有的基于价值的课程: 如果程序试图将两个引用区分为基于值的类的相等值,无论是直接通过引用相等还是间接通过对同步,身份哈希, 序列化或任何其他身份敏感机制的诉求,程序可能会产生不可预测的结果。 关于未来的价值类型: 通过System.identityHashCode提供的对象的默认基于身份的哈希代码也不适用于值类型。 像序列化这样的内部操作会对对象进行基于身份的区分,这些操作要么不适用于值(因为它们不适用于基元),要么它们会使用值类型的hashCode方法提供的基于值的区别。 因为未来的JVM实现可能不会使用对象标头和基于值的类的引用指针,所以一些限制很明显。 (例如,没有锁定JVM必须不支持的标识。锁定的引用可以被删除并在以后被另一个替换,这使得释放锁定毫无意义并将导致死锁)。 但我不知道序列化如何发挥作用。 为什么它被视为“身份敏感机制” ? 为什么它“以对象为基础进行基于身份的区分” ?

使用Jackson来(De) – 将Scala案例类序列化

我使用Jackson测试了Scala案例类的序列化。 DeserializeTest.java public static void main(String[] args) throws Exception { // being lazy to catch-all final ObjectMapper mapper = new ObjectMapper(); final ByteArrayOutputStream stream = new ByteArrayOutputStream(); mapper.writeValue(stream, p.Foo.personInstance()); System.out.println(“result:” + stream.toString()); } } Foo.scala object Foo { case class Person(name: String, age: Int, hobbies: Option[String]) val personInstance = Person(“foo”, 555, Some(“things”)) val PERSON_JSON = […]

如何使用JAXB从服务返回的’anyType’创建java对象?

Web服务返回由WSDL定义的对象: 当我打印出这个对象的类信息时,它出现为: class com.sun.org.apache.xerces.internal.dom.ElementNSImpl 但我需要将此对象解组为以下类的对象: @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = “”, propOrder = { “info”, “availability”, “rateDetails”, “reservation”, “cancellation”, “error” }) @XmlRootElement(name = “ArnResponse”) public class ArnResponse { } 我知道响应是正确的,因为我知道如何编组这个对象的XML: Marshaller m = jc.createMarshaller(); m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE ); m.marshal(rootResponse, System.out); 打印出来: 如何将我看到的ElementNSImpl对象转换为我知道它代表的ArnResponse对象? 此外,我正在AppEngine上运行,其中文件访问受到限制。 谢谢你的帮助 更新 : 我添加了@XmlAnyElement(lax=true)注释,如下所示: @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = “”, propOrder = { “content” }) @XmlSeeAlso(ArnResponse.class) […]

现在,当对象具有不同的serialVersionUID时,如何反序列化数据库中持久存在的对象

我的客户端有一个oracle数据库,一个对象通过objOutStream.writeObject持久化为blob字段,该对象现在有一个不同的serialVersionUID (即使该对象没有变化,可能是不同的jvm版本),当他们尝试反序列化时抛出exception: java.io.InvalidClassException: CommissionResult; local class incompatible: stream classdesc serialVersionUID = 8452040881660460728, local class serialVersionUID = -5239021592691549158 他们从一开始就没有为serialVersionUID分配一个固定的值,所以现在有些东西改变了抛出exception。 现在他们不想丢失任何数据,为此我认为最好的方法是读取对象,对它们进行反序列化,然后通过XMLEncoder再次保存它们,以避免将来的错误,如当前的“类不兼容”错误。 显然,对于该对象持有的serialVersionUID有2个不同的值,所以我想读取数据,尝试使用一个值,如果失败则尝试使用其他值,为此我尝试更改类的serialVersionUID使用ASM api 。 我已经能够更改值,但问题是如何在类上激活更改,因此当它被反序列化时, objInpStr.readObject()将我的修改版本的类与我的特定serializedVersionUID 。 我做了一个测试类来模拟真实的环境,我拿一个对象(它具有不同serialVersionUID问题的对象属性)对象名称是Reservation属性是CommissionResult : public class Reservation implements java.io.Serializable { private CommissionResult commissionResult = null; } public class CommissionResult implements java.io.Serializable{ } import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.commons.SerialVersionUIDAdder; public class […]