Tag: 序列化

GSON将布尔值序列化为0或1

所有, 我正在尝试执行以下操作: public class SomClass { public boolean x; public int y; public String z; } SomClass s = new SomClass(); sx = true; sy = 10; sz = “ZZZ”; Gson gson = new Gson(); String retVal = gson.toJson(s); return retVal; 所以这个小片段会产生: {“x”:true,”y”:10,”z”:”ZZZ”} 但我需要它生产的是: {“x”:0, “y”:10,”z”:”ZZZ”} 有人可以给我一些选择吗? 我不希望将我的布尔值重写为整数,因为这将导致现有代码存在若干问题(非显而易见,难以阅读,难以执行等)

通过ByteBuffer和CQL 3将Java对象序列化为Cassandra 1.2

我拼凑了下面没有做任何复杂的代码 – 只需创建一个byte []变量,将其写入Cassandra的blob字段(v1.2,通过新的Datastax CQL库),然后将其读回再次出来。 当我把它放在它的3个元素长时,当我读回它时,它是84个元素长…! 这意味着我实际上要做的事情(序列化Java对象)失败,并带有org.apache.commons.lang.SerializationException: java.io.StreamCorruptedException: invalid stream header: 81000008错误时再次尝试反序列化。 这是一些演示我的问题的示例代码: import java.nio.ByteBuffer; import org.apache.commons.lang.SerializationUtils; import com.datastax.driver.core.BoundStatement; import com.datastax.driver.core.Cluster; import com.datastax.driver.core.Host; import com.datastax.driver.core.Metadata; import com.datastax.driver.core.PreparedStatement; import com.datastax.driver.core.ResultSet; import com.datastax.driver.core.Row; import com.datastax.driver.core.Session; public class TestCassandraSerialization { private Cluster cluster; private Session session; public TestCassandraSerialization(String node) { connect(node); } private void connect(String node) { cluster […]

自制与Java序列化

我有一个需要持久保存在数据库上的POJO,当前设计将其字段指定为单个字符串列,并且不向表中添加其他字段。 意思是,对象需要以某种方式序列化。 所以只是为了基本的实现,我去设计了我自己的对象的序列化forms,这意味着将它的所有字段连接成一个很好的字符串,用我选择的分隔符分隔。 但这是相当丑陋的,并且可能会导致问题,比如说其中一个字段包含我的分隔符。 所以我尝试了基本的Java序列化,但是从我进行的一个基本测试来看,这在某种程度上变成了一个非常昂贵的操作(构建一个ByteArrayOutputStream,一个ObjectOutputStream,依此类推,反序列化)。 那么我的选择是什么? 序列化对象进入数据库的首选方法是什么? 编辑:这将是我项目中非常常见的操作,因此必须将开销保持在最低限度,并且性能至关重要。 此外,第三方解决方案很好,但不相关(并且通常产生我试图避免的开销)

Java:何时在序列化期间添加readObjectNoData()?

我正在阅读“Effective Java”中的序列化章节。 我试图理解书中的下一段。 如果您实现的类具有可序列化和可扩展的实例字段,那么您应该注意这一点。 如果类的实例字段初始化为默认值(整数类型为零,布尔值为false,对象引用类型为null),则会违反不变量,必须将此readObjectNoData方法添加到类中: // readObjectNoData for stateful extendable serializable classes private void readObjectNoData() throws InvalidObjectException { throw new InvalidObjectException(“Stream data required”); } 我不确定上述陈述的含义。 为了测试这个,我创建了一个Person类(可序列化和可扩展) class Person implements Serializable{ private String name; private int age; Person() { this(“default”,1); } Person(String name, int y) { this.name = name; this.age = y; } } 以及扩展它的类Employee。 class […]

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

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

处理序列化框架的不兼容版本更改

问题描述 我们有一个Hadoop集群,我们在其上存储使用Kryo (序列化框架)序列化为字节的数据。 我们用来做这个的Kryo版本已从正式版本2.21中分离出来,将我们自己的补丁应用于我们使用Kryo遇到的问题。 当前的Kryo 2.22版本也修复了这些问题,但使用了不同的解决方案。 因此,我们不能只更改我们使用的Kryo版本,因为这意味着我们将无法再读取已存储在Hadoop集群中的数据。 为了解决这个问题,我们想要运行一个Hadoop作业 读取存储的数据 反序列化使用旧版Kryo存储的数据 使用新版本的Kryo序列化已还原的对象 将新的序列化表示写回我们的数据存储 问题是在一个Java程序中使用同一个类的两个不同版本并不简单(更准确地说,在Hadoop作业的映射器类中)。 问题简而言之 如何在一个Hadoop作业中使用同一序列化框架的两个不同版本反序列化和序列化对象? 相关事实概述 我们将数据存储在Hadoop CDH4集群上,使用Kryo版本2.21.2-ourpatchbranch进行序列化 我们希望将数据与Kryo 2.22版本序列化,这与我们的版本不兼容 我们使用Apache Maven构建我们的Hadoop作业JAR 可能的(也是不可能的)方法 (1)重命名包 我们想到的第一种方法是使用Maven Shade插件的重定位function重命名我们自己的Kryo分支中的包,并使用不同的工件ID释放它,这样我们就可以依赖转换作业项目中的两个工件。 然后,我们将实例化旧版本和新版本的一个Kryo对象,并使用旧版本进行反序列化,并使用新版本再次序列化对象。 问题 我们不在Hadoop作业中明确使用Kryo,而是通过我们自己的库的多个层访问它。 对于这些库中的每一个,都有必要 重命名涉及包和 使用不同的组或工件ID创建发布 为了使事情更加混乱,我们还使用其他第三方库提供的Kryo序列化程序,我们必须做同样的事情。 (2)使用多个类加载器 我们提出的第二种方法是在包含转换作业的Maven项目中完全不依赖于Kryo,而是从每个版本的JAR加载所需的类,该版本存储在Hadoop的分布式缓存中。 然后序列化对象看起来像这样: public byte[] serialize(Object foo, JarClassLoader cl) { final Class kryoClass = cl.loadClass(“com.esotericsoftware.kryo.Kryo”); Object k = kryoClass.getConstructor().newInstance(); ByteArrayOutputStream baos = […]

Java:JSON – > Protobuf和后向转换

我有一个现有的系统,它在GUI和服务器之间使用基于protobuf的通信协议。 现在我想添加一些持久性,但目前protobuf消息直接转换为第三方自定义对象。 有没有办法将原型消息转换为json ,然后可以将其保存到数据库。 注意:我不太喜欢将二进制protobuf写入数据库的想法,因为它有一天会变得不能与新版本向后兼容并以这种方式破坏系统。

Java Serialization vs JSON vs XML

我想知道在处理通过网络传输对象时我们应该选择什么序列化机制。 优缺点都有什么 ? 我知道大多数时候我们使用JSON或XML进行AJAX因为传输格式几乎是Javascript格式,而且JSON非常轻巧,占用空间小,因此Java序列化完全不在桌面之内?

使用Google的Gson进行严格的JSON解析?

假设我使用Google的Gson库将JSON解析为Java数据结构。 如果存在没有相应JSON的Java字段,是否有一种简单的方法可以抛出exception? 也就是说,我希望JSON拥有Java结构中的所有字段。

Java对象序列化性能提示

我必须将一个巨大的对象树(7,000)序列化到磁盘中。 最初我们将这棵树保存在一个带有Kodo的数据库中,但它会使成千上万的查询将这棵树加载到内存中,并且它将占用本地宇宙可用时间的很大一部分。 我为此尝试了序列化,实际上我获得了性能提升。 但是,我觉得我可以通过编写自己的自定义序列化代码来改进这一点。 我需要尽快加载这个序列化对象。 在我的机器中,序列化/反序列化这些对象大约需要15秒。 从数据库加载它们大约需要40秒。 关于我可以做些什么来改善这种性能的任何提示,考虑到因为对象在树中,它们相互引用?