对于我的一个项目,我需要定义一个扩展的新异常ProviderMismatchException.
从javadoc链接中,您可以看到此异常:
IllegalArgumentException,哪个RuntimeException,哪个Exception,哪个Throwable.所有这些都定义了自己的,static final serialVersionUID除了Throwable添加private修饰符.
现在,如果你实现了一个接口Foo,那么所有继承的classse也会实现该接口,这也代表Serializable着它; 但是,为什么JDK中的子类为每个子类重新定义它?没有为继承的类再次定义它的危险是什么?
如果我实现Externalized,我是否需要在该类中指定serialVersionUID以实现版本兼容性?
换句话说,Java 在反序列化Externalized 对象时是否检查serialVersionUID?
基于Java的serialVersionUID问题,当序列化为JSON时是否有必要定义serialVersionUID?
private static final long serialVersionUID = 234239427349L;
Run Code Online (Sandbox Code Playgroud)
我理解当一个对象是二进制序列化(RPC等)时,框架会添加类元数据以了解它被序列化到哪个版本,如果它是错误的则拒绝.如果JSON没有任何串行版本字段(_v),那么这似乎没用.(虽然SONAR发出警告!)
我有两个实现Serializable的java类.我将它们都设置为1L的serialVersionUid.
同事说所有类必须具有唯一的串行版本uid,并且如果jvm具有相同的串行版本uid,则jvm将把类视为相等.我认为相等是基于equals方法的结果而不是串行版本uid.
我的理解是,串行版本uid用于指示类的版本,并且当类以不兼容的方式更改时,串行版本的uid应该递增.
那是对的吗?是否可以使用1的serialversion uid?或者java类从来没有1L的serialversion uid?
它让我从Serializable界面的启动中感到困惑,为什么我必须在我的所有课程中加入这个领域.我知道这个接口需要一个唯一的标识符来标记类,但为什么它们不能在运行时生成它.例如,他们可以使用完全限定类名的MD5哈希或者用于处理罕见事件中的重复项的类似方法来生成它(也就是说,我确定,当被要求生成id时,eclipse会做什么).
所以我要问的是(这篇文章不仅仅是对标准库的咆哮)究竟是如何使用框架化序列化字段的?
我想知道的原因是因为我将尝试创建一个Aspect(使用AspectJ或其他语言),它将使用MD5哈希添加serialVersionUID字段,并且能够以API可接受的方式处理冲突.
如果我能让它发挥作用,我会发布结果.
当我Serializable在课堂上时,是否需要添加Serializable到班级中的所有对象?
例如,
public class User implements Serializable{
private List<Role> role;
private Task task;
}
Run Code Online (Sandbox Code Playgroud)
我是否需要添加Serializable到Role和Task,太?
public class Task implements Serializable{
// ...
}
public class Role implements Serializable{
// ...
}
Run Code Online (Sandbox Code Playgroud) 我遇到了一个异常处理程序类,它扩展了异常,如下所示:
public class AppFileReaderException extends Exception {
//Explicit serialization UID added
private static final long serialVersionUID = -2458461415998318236L;
public AppFileReaderException(String msg)
{
super(msg);
}
Run Code Online (Sandbox Code Playgroud)
作者使用了显式序列化版本UID,并在其他类似的异常处理程序类中忽略了它.基于我从另一篇SO帖子中理解的内容,如果应用程序没有使用任何序列化和反序列化,我们可以忽略序列化UID.奇怪的是,作者使用了否定的UID.我很想知道这是有效还是推荐的做法.有没有其他理由使用负序列版本的VID?
每当我们尝试serialize一个Class的对象时,我们总是有一个唯一的值serialVersionId作为私有final字段,它的意义是什么deserialization,我们可以使用它来检查对象和值是否已经以适当的方式反序列化?
在我们最新的应用程序版本中,我们看到了一些kotlin.NoWhenBranchMatchedException报告给Fabric / Crashlytics的消息。
这是有问题的代码段:
private lateinit var welcome: Welcome
// ...
welcome.welcomeStateLoginStatus.let {
val handled = when (it) {
UnknownUser -> {
btn_login.visibility = View.VISIBLE
btn_logout.visibility = View.GONE
secondButtonFocusedInfoText = getString(R.string.welcome_login_button_info)
tv_user_description.text = null
}
is InternalUser -> {
btn_login.visibility = View.GONE
btn_logout.visibility = View.VISIBLE
secondButtonFocusedInfoText = "Logout"
tv_user_description.text = "Logged in as internal user"
}
ExternalUser -> {
btn_login.visibility = View.GONE
btn_logout.visibility = View.VISIBLE
secondButtonFocusedInfoText = "Logout"
tv_user_description.text = "Logged in as external user"
}
}
} …Run Code Online (Sandbox Code Playgroud) 在现有的新成员方法中添加新成员方法之后,我面临以下问题class Response implements Serializable{}.没有声明显式的串行版本ID.多次尝试,我得到相同的序列号.
Error communicating with the webserver: com.abc.xyz.app.util.common.Response;
local class incompatible: stream classdesc serialversionUID =
-3900355805473150430, local class serialversionUID =
-6706527232726476603
Run Code Online (Sandbox Code Playgroud)
经过一些文档后,我尝试修改class Response附加行:private final static long serialVersionUID = 1L;.
通过此更改,以下是错误:
Error communicating with the webserver: com.abc.xyz.app.util.common.Response;
local class incompatible: stream classdesc serialversionUID =
-3900355805473150430, local class serialversionUID = 1
Run Code Online (Sandbox Code Playgroud)
这些是位于webappstomcat文件夹中并xyz.jnlp在客户端计算机上加载的类.xyz.jnlp从远程网络服务器加载新客户机.但事情不起作用!
请帮我理解这个问题.
java ×9
serializable ×2
android ×1
aspects ×1
inheritance ×1
jnlp ×1
kotlin ×1
mongodb ×1
sealed-class ×1