草庐IT

Serialization

全部标签

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

要增强集群中的消息传递,重要的是要在运行时了解消息的大小(我应该更喜欢本地处理还是远程处理)。我只能找到有关基于Java检测估计对象内存大小的框架。我已经测试了classmexer,它没有接近序列化大小和sourceforgeSizeOf。在一个小型测试用例中,SizeOf的错误率大约为10%,而且比序列化快10倍。(仍然transient完全打破了估计,因为例如ArrayList是transient的但被序列化为数组,修补SizeOf并不容易。但我可以接受)另一方面,10%错误率的10倍速度似乎不太好。我有什么想法可以做得更好吗?更新:我还测试了ObjectSize(http://s

java - 通过 ByteBuffer 和 CQL 3 将 Java 对象序列化到 Cassandra 1.2

我将下面的代码拼凑在一起,没有做任何复杂的事情——只是创建一个byte[]变量,将它写入Cassandra中的一个blob字段(v1.2,通过新的DatastaxCQL库),然后再次读回。当我放入它时它有3个元素长,而当我读回它时它有84个元素长...!这意味着我实际尝试做的事情(序列化Java对象)在尝试时失败并出现org.apache.commons.lang.SerializationException:java.io.StreamCorruptedException:invalidstreamheader:81000008错误再次反序列化。下面是一些演示我的问题的示例代码:im

c# - 跨语言(java和c#)对象序列化的策略

我正在做一个项目,我需要在Java6应用程序中序列化一些数据,并在C#2.0应用程序中反序列化它。有没有我可以查看的策略或已经存在的东西可以让我用这两种语言来做到这一点?我猜他们都支持XML序列化,但我真的需要它进行二进制序列化。 最佳答案 Protocolbuffers在这里是个不错的选择。在C#方面,我会推荐JonSkeet的dotnet-protobufs对于这个用例,因为它在双方都有相同的API(他的C#版本是GoogleJava版本的端口,是核心发行版的一部分)。如果您希望C#更“典型的.NET”,那么protobuf-n

java - Java序列化如何保证枚举的一致性?

当我序列化一个对象时,我可以在类级别使用serialVersionUID机制来保证两种类型的兼容性。但是,当我序列化枚举值的字段时会发生什么?有没有办法确保枚举类型在序列化和反序列化之间没有被操作?假设我有一个像OperationResult{SUCCESS,FAIL}这样的枚举,以及一​​个正在序列化的对象中名为“result”的字段。我如何确保,当对象被反序列化时,即使有人恶意颠倒了两者,结果仍然是正确的?(假设枚举在别处声明为静态枚举)出于好奇,我想知道-我使用jar级身份验证来防止操纵。 最佳答案 发件人:http://ww

java - jackson :如何仅序列化带注释的属性

我想在使用Jackson时定义我的自定义序列化策略(要包含哪些字段)。我知道,我可以使用View/过滤器来做到这一点,但它引入了非常糟糕的事情-使用字段名称的字符串表示,这会自动启用自动重构问题。我如何强制Jackson只序列化带注释的属性,仅此而已? 最佳答案 如果您禁用所有自动检测,它应该只序列化您已注释的属性——无论是属性本身还是getter。这是一个简单的例子:privateObjectMapperom;@BeforepublicvoidsetUp()throwsException{om=newObjectMapper();

java - 在 Serializable Java 类中使用 Logger 的正确方法是什么?

我正在处理的系统中有以下(已修改)类,并且Findbugs正在生成SE_BAD_FIELD警告,我试图理解为什么在我按照我认为的方式修复它之前它会这么说。我感到困惑的原因是因为描述似乎表明我在类中没有使用其他不可序列化的实例字段但是bar.model.Foo也不可序列化并且以完全相同的方式使用(据我所知可以分辨),但Findbugs不会为其生成警告。importbar.model.Foo;importjava.io.File;importjava.io.Serializable;importjava.util.List;importorg.slf4j.Logger;importorg.

java - 在 Java 中将子类设置为不可序列化

我有一个实现可序列化的类。现在我扩展了这个类,我希望这个扩展类是不可序列化的。那怎么办呢?例如。我有classAimplementsSerializable.我有classBextendsA.但我希望B类是不可序列化的。 最佳答案 您不能删除接口(interface),但可以在运行时阻止序列化:classBextendsA{privatevoidwriteObject(ObjectOutputStreamoos)throwsIOException{thrownewNotSerializableException();}}

java - 了解 Spark 的闭包及其序列化

免责声明:刚开始玩Spark。我无法理解著名的“任务不可序列化”异常,但我的问题与我在SO上看到的问题有点不同(或者我认为如此)。我有一个很小的自定义RDD(TestRDD)。它有一个字段,用于存储其类未实现可序列化(NonSerializable)的对象。我已将“spark.serializer”配置选项设置为使用Kryo。但是,当我在我的RDD上尝试count()时,我得到以下信息:Causedby:java.io.NotSerializableException:com.complexible.spark.NonSerializableSerializationstack:-ob

java - 在编译类中不进行反射的序列化

由于客户端JVM的限制,由于不支持反射,我无法使用任何流行的序列化程序。我正在寻找一种执行字节码操作的工具,通过将编写器和读取器方法注入(inject)已编译的类来实现序列化。我需要字节码操作java代码来将其与我的代码绑定(bind)以构建过程。我一直在通过生成代码并将其注入(inject)源代码,然后再编译以使用我的自定义序列化程序来执行此操作。我想避免这种方法,因为我不想让您以任何方式修改源文件。我知道Kryo和其他XML和JSON序列化程序,但它们不符合我的需求。谢谢。 最佳答案 尝试javassist.对于您的特定项目,它

java - 如何处理包改变的Java序列化对象?

我有一个存储在HttpSession对象中的Java类,该对象在集群环境中的服务器之间进行序列化和传输。为了便于解释,我们称这个类为“人”。在改进代码的过程中,此类已从“com.acme.Person”移至“com.acme.entity.Person”。在内部,该类保持完全相同(相同的字段、相同的方法、相同的一切)。问题是我们有两套服务器同时运行旧代码和新代码。使用旧代码的服务器已序列化HttpSession对象,当新代码反序列化它时,它会抛出ClassNotFoundException,因为它找不到对com.acme.Person的旧引用。此时,很容易处理这个问题,因为我们可以使用