JAVA序列化问题求助

仰望星空_Star 2016-06-01 08:08:39
先上代码:
public interface T {

void test();
}

public class ST implements T{

@Override
public void test() {
List<UserSevenDayFace> d=new ArrayList<>();
d.add(new UserSevenDayFace(){{setDate("K");setOfficialPrice(0.0);setUserPrice(0.0);}});
//这里封装了一个方法将这个集合序列化后存入Redis中,但是运行程序这里会报错:
//java.io.NotSerializableException: com.dingxin.kunyu.test.ST
SimpleCacheUtil.setObject("a", d);
System.out.println("d");
System.out.println(SimpleCacheUtil.getObject("a"));

}
public static void main(String[] args) {
new ST().test();
}
}


UserSevenDayFace类:
public class UserSevenDayFace implements Serializable{

/**
*
*/
private static final long serialVersionUID = 1L;
private String date;
private Double officialPrice;
private Double userPrice;
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public Double getOfficialPrice() {
return officialPrice;
}
public void setOfficialPrice(Double officialPrice) {
this.officialPrice = officialPrice;
}
public Double getUserPrice() {
return userPrice;
}
public void setUserPrice(Double userPrice) {
this.userPrice = userPrice;
}
}

现在的问题的为什么这样无法对UserSevenDayFace类进行序列化?
反编译了一下class文件发现ST 类的代码有两个ST.class与ST$1.class是,
ST$1.class代码为:
class ST$1
extends UserSevenDayFace
{
ST$1(ST paramST)
{
setDate("K");setOfficialPrice(Double.valueOf(0.0D));setUserPrice(Double.valueOf(0.0D));
}
}

对这个代码不太理解,为什么ST$1的构造函数中会有ST 参数?

我对ST的代码做了下修改:
ST:
public class ST implements T{

@Override
public void test() {


}
public static void main(String[] args) {
List<UserSevenDayFace> d=new ArrayList<>();
d.add(new UserSevenDayFace(){{setDate("K");setOfficialPrice(0.0);setUserPrice(0.0);}});
SimpleCacheUtil.setObject("a", d);
System.out.println("d");
System.out.println(SimpleCacheUtil.getObject("a"));
}
}

编译后同样有两个文件ST与ST$1
ST$1代码为:
class ST$1
extends UserSevenDayFace
{
ST$1()
{
setDate("K");setOfficialPrice(Double.valueOf(0.0D));setUserPrice(Double.valueOf(0.0D));
}
}

但是这里再运行发现 程序可以正常执行,也可以序列化了,但是为什么 ?而且为什么ST$1的构造函数中没有了参数?
...全文
251 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
sky_08_06_02 2016-07-07
  • 打赏
  • 举报
回复
LOVEv海盗 2016-06-02
  • 打赏
  • 举报
回复
这是因为内部类的特性造成的: 第一种情况: @Override public void test() { new UserSevenDayFace(){} } 这是一个局部内部类(extends UserSevenDayFace),和成员内部类一样,这个类里面会有一个指向外部类实例的引用。当你将该类序列化时,会将该类所有(排除transient修饰的)的成员变量序列化(其中包含指向外部类的引用),由于外部类没有implements Serializable,所以序列化失败。 第二种情况: public static void main(String[] args) { new UserSevenDayFace(){} } 这是一个局部静态内部类,和静态内部类一样,这个类不会持有外部类实例的引用(在静态main方法中创建的实例,也获取不到外部类的实例),所以序列化成功。 你反编译之后的代码正好印证:
class ST$1
  extends UserSevenDayFace
{
  ST$1(ST paramST) //传入外部类实例的引用
  {
    setDate("K");setOfficialPrice(Double.valueOf(0.0D));setUserPrice(Double.valueOf(0.0D));
  }
}

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧