【发布时间】:2015-07-31 09:40:13
【问题描述】:
ObjectInputStream.readFields() 仅适用于 private void readObject(ObjectInputStream) 方法。
public ObjectInputStream.GetField readFields() throws IOException, ClassNotFoundException {
SerialCallbackContext ctx = curContext;
if (ctx == null) {
throw new NotActiveException("not in call to readObject");
}
...
我无法使用默认序列化来读取对象(即ObjectInputStream.defaultReadObject())并且不希望在我的所有类中实现readObject() 方法。在理想情况下,我希望有 ownDefaultReadObject() 方法,该方法将从序列化字段(例如通过反射)构造新对象。
有什么想法吗?
如果有人想了解更多。我的一些类中的字段名称被重命名(例如通过混淆器)为 a、b、c 等。这些类使用默认的 Java 序列化使用重命名的字段进行序列化。我需要将它们反序列化为原始类(我知道每个类的字段名称对;a=> fieldName、b=> age、c=>gender 等)。
【问题讨论】:
-
您的愿望是一回事,但您的原因是什么?不执行
readObject()? -
我不是在质疑您的选择,但是实现将调用委托给自定义处理程序的
readObject()不会更容易吗?这样,即使您需要在每个类中实现该方法,实现也只是一个方法调用。 -
@EJP 16:我有数百个这样的课程。将来可以添加/删除它们。我不希望开发中的任何人。团队甚至会想到序列化/反序列化问题。我必须使用字节码检测(例如 Javassist)在构建过程中添加 readObject() 方法的选项之一,但想使用更简单的解决方案。
-
@biziclop:是的,我正在考虑这个解决方案,但使用字节码检测。希望存在一个更容易的。
-
@FoxyBOA 我会说可能没有更简单的解决方案。但这只是基于序列化工作的一般方式的猜测,可能有一个不太可能的钩子可以附加这个逻辑。
标签: java serialization deserialization obfuscation objectinputstream