Tag: 序列化

在java中使用jackson json反序列化时忽略缺少的属性

在这个例子中 Class Person{ String name; int age; } 如果json对象缺少属性’age’, { name : John } Person person = objectMapper.readValue(jsonFileReader, Person.class); 它抛出一个JsonMappingException,说它不能反序列化。 是否有注释在反序列化期间忽略缺少的字段? 谢谢

使用gson反序列化json数组

继续这个问题 。 我无法反序列化以下json数组(抱歉大小): “geometry”: { “type”: “Polygon”, “coordinates”: [ [ [ 771230.894373, 4422896.962001 ], [ 804804.852796, 4451159.130080 ], [ 876828.563339, 4417873.954498 ], [ 959794.979827, 4430944.287708 ], [ 910992.515063, 4372980.866944 ], [ 932488.308736, 4357684.778349 ], [ 918573.372386, 4115663.286966 ], [ 834059.614976, 4013708.358795 ], [ 929360.231044, 3833522.241529 ], [ 1008029.715188, 3776446.653183 ], [ 1061663.445852, 3533717.758754 ], [ […]

序列化对象的文件扩展名

将Serializable对象保存到磁盘时,最适合的文件扩展名是什么? FileOutputStream fos = null; ObjectOutputStream out = null; try { fos = new FileOutputStream(filename); out = new ObjectOutputStream(fos); out.writeObject(mySerializableObject); } catch (IOException ex) { ex.printStackTrace(); } finally { IOUtils.closeQuietly(out); }

将Serializable对象传递给Pending Intent

我试图将一个可序列化的对象发送到挂起的Intent。 问题是收到的警报返回为null。 即使Alarm实现了可序列化的接口。 //AlarmService.java Intent myIntent = new Intent(getApplicationContext(), AlarmAlertBroadcastReciever.class); Bundle bundle = new Bundle(); bundle.putSerializable(“alarm”, alarm); myIntent.putExtras(bundle); PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, myIntent, PendingIntent.FLAG_CANCEL_CURRENT); AlarmManager alarmManager = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, alarm.getAlarmTime().getTimeInMillis(), pendingIntent); 收到的警报为空。 //AlarmAlertBroadcastReceiver.java public class AlarmAlertBroadcastReciever extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Alarm alarm = (Alarm)intent.getExtras().getSerializable(“alarm”); } } 编辑:我尝试过的更多内容如下,但它似乎不起作用: […]

Java中的零垃圾大字符串反序列化,Humongous对象问题

我正在寻找一种方法从Java中的byte[]反序列化String ,尽可能少生成垃圾。 因为我正在创建自己的序列化器和反序列化器,所以我可以完全自由地在服务器端(即在序列化数据时)和客户端(即在反序列化数据时)实现任何解决方案。 我已经设法通过遍历String’s ( String.charAt(i) )并将每个char (16位值)转换为2x 8位值,有效地序列化 String而不会产生任何垃圾开销。 这里有一个很好的辩论。 另一种方法是使用Reflection直接访问String’s底层char[] ,但这超出了问题的范围。 但是,我似乎不可能在不创建char[] 两次的情况下反序列化byte[] ,这看起来很奇怪。 步骤: 创建char[] 迭代byte[]并填写char[] 使用String(char[])构造函数创建String 由于Java的String immutability规则,构造函数复制char [],创建2x GC开销。 我总是可以使用机制来规避这个(不安全String分配+reflection来设置char[]实例),但我只是想问一下除了我违反String’s不变性的每个约定之外是否还有其他后果。 当然,对此最明智的回应是“来吧,停止这样做,并相信GC,原始的char[]将是非常短暂的,G1将暂时摆脱它”,这实际上是有道理的, 如果char[]小于G1区域大小的1/2 。 如果它更大,char []将直接分配为一个巨大的对象(即自动传播到G1的区域之外)。 这些物体很难在G1中有效地进行垃圾收集。 这就是每个分配都很重要的原因。 关于如何解决这个问题的任何想法? 非常感谢。

如何附加到现有的java.io.ObjectStream?

至于现在,当我尝试追加一个Object时,我会得到java.io.StreamCorruptedException 。 我在互联网上搜索了一种克服这种情况的方法。 到目前为止我找到的答案是无法完成的。 解决此问题的方法是将对象写入列表,然后将列表写入文件。 但是每次添加新对象时我都要覆盖该文件。 它似乎不是加class的最佳解决方案。 有没有办法将对象附加到现有的对象流?

通过网络进行Java序列化

只是想知道是否有一个教程或如何序列化对象,通过网络将它们放入流中,并在另一侧反序列化它。 我理解序列化,I / O,流,套接字等的原理,我只想了一个客户端向服务器发送对象的示例。

Java:writeObject与writeExternal的效率

据说Java的默认序列化机制效率不高,因为a)它发现通过reflection写入/读取的字段通常很慢b)它将额外的数据写入流。 提高效率的一种方法是实现Externalizable及其writeExternal / readExternal方法。 这是一个问题:如果我改为提供’writeObject / readObject’方法并且不在其中调用deafiltWriteObject / defaultReadObject,那么这个机制将不会使用reflection来确定要写入/读取的字段,而且它不会写入额外的要流式传输的数据(还是不确定)? 那么从效率的角度来看,实现上面提到的writeObject / readObject与实现Externalizable一样吗? 或者后一种选择是否会带来一些前者不具备的实际效益? 编辑:当然,差异是当实现readObject / writeObject的Serializable类被子类化时,如果子类有自己的readObject / writeObject,则它们不需要调用super的readObject / writeObject。 如果超级/子类改为实现Externalizable,则不是这样。 在这种情况下,需要显式调用super的writeExternal / readExternal。 然而,从效率的角度来看,这种差异是无关紧要的。

访问实例字段和方法的Java 8 lambda无法反序列化

在我看来,这是编译器或JVM中的一个错误,但也许有人有更好的解释。 下面的代码运行正常,但如果我取消注释第二个runnable初始化,它直接使用’this’,它不能反序列化对象( in.readObject()抛出exception)。 public class TestClass implements Serializable { String msg = “HEY!”; SerializableRunnable runnable; public TestClass() { TestClass self = this; runnable = () -> self.say(); // uses a local copy of ‘this’ // runnable = () -> this.say(); // uses ‘this’ directly } public void say() { System.out.println(msg); } public static void main(String[] […]

Java:从磁盘写入/读取映射

我是Java的新手,所以我不确定最好的方法。 我有一个数据结构,我希望能够在关闭程序之前写入文件,然后从文件中读取以在下次应用程序启动时重新填充结构。 我的结构是HashMap 。 对象非常简单; 对于成员变量,它有一个String,以及两个Boolean类型的小型本机数组。 这是一个非常简单的应用程序,我不希望一次超过10-15个对。 我一直在用Object输入/输出流进行实验(不成功)。 我是否需要使Object类可序列化? 你能给我任何关于最佳方法的建议吗? 我只需要朝着正确的方向努力。 谢谢! 编辑:嗯,我仍然感到愚蠢,我正在从一张地图写入并阅读另一张地图,然后比较它们以检查我的结果。 显然我在比较他们错了。 叹。