![]() |
1
34
简单的回答是“不”,不幸的是-我经常想要这个。但瞬变不可能是最终的。
(严格地说,期末考试只有在第一次阅读时才是期末考试,所以有些黑客可能会在阅读前赋值,但对我来说,这一步走得太远了。) |
![]() |
2
17
所以,在
|
![]() |
3
15
是的,这很容易实现(显然鲜为人知!)
|
![]() |
4
5
解决这类问题的一般方法是使用“串行代理”(参见有效的Java第2版)。如果您需要在不破坏串行兼容性的情况下将其改装为现有的可串行化类,那么您将需要进行一些黑客攻击。 |
![]() |
5
4
它还利用
GetField
该解决方案通过将检索到的字段存储在临时临时临时字段(称为
所包含的微基准测试可确保此解决方案不会比默认的序列化/反序列化慢。事实上,它在我的电脑上:
下面是代码:
注意:每当类引用另一个对象实例时,可能会泄漏序列化过程创建的临时“实例”:对象解析仅在读取所有子对象之后发生,因此子对象可能会保留对临时对象的引用。类可以通过检查
自我提醒:也许五年后会有更好的解决方案。到时候见! |
|
6
0
这个问题是关于Java默认序列化程序的,但我是通过搜索Gson而来到这里的。这个答案不适用于默认的序列化程序,但它确实适用于Gson,也许还有其他的。我不喜欢(手动)使用反射或
反序列化时,Gson调用默认构造函数来创建对象。您可以将临时最终赋值移动到默认构造函数,它们将被正确地赋值。如果您只有一个非默认的构造函数来分配最终变量(例如,一个ID),那么将它们分配给什么并不重要,因为它们将被Gson用反射覆盖。 这确实意味着,如果您的临时最终赋值依赖于构造函数参数,这将不起作用。 下面是一些示例代码:
|