java 类不能序列化_不能序列化我的Java类

似乎我无法序列化名为"ban"的类:

class Ban implements Serializable{

/**

*

*/

transient Date start;

transient Date end;

String explination;

String from;

public Ban(Date s, Date e, String ex, String f){

start = s;

end = e;

explination = ex;

from = f;

}

}

当我尝试用ObjectOutputStream打印这个时,它会给我一个错误…你能帮我把这门课连载一下吗?顺便问一下:瞬变是什么意思?

好吧,这是布基特,但这应该做到:

[SEVERE] java.io.NotSerializableException: me.bubblegumsoldier.Ban.Main

2013-04-03 19:30:30 [SEVERE]    at java.io.ObjectOutputStream.writeObject0(Unknown Source)

2013-04-03 19:30:30 [SEVERE]    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)

2013-04-03 19:30:30 [SEVERE]    at java.io.ObjectOutputStream.writeSerialData(Unknown Source)

2013-04-03 19:30:30 [SEVERE]    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)

2013-04-03 19:30:30 [SEVERE]    at java.io.ObjectOutputStream.writeObject0(Unknown Source)

2013-04-03 19:30:30 [SEVERE]    at java.io.ObjectOutputStream.writeObject(Unknown Source)

2013-04-03 19:30:30 [SEVERE]    at java.util.HashMap.writeObject(Unknown Source)

2013-04-03 19:30:30 [SEVERE]    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

2013-04-03 19:30:30 [SEVERE]    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

2013-04-03 19:30:30 [SEVERE]    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

2013-04-03 19:30:30 [SEVERE]    at java.lang.reflect.Method.invoke(Unknown Source)

2013-04-03 19:30:30 [SEVERE]    at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)

2013-04-03 19:30:30 [SEVERE]    at java.io.ObjectOutputStream.writeSerialData(Unknown Source)

2013-04-03 19:30:30 [SEVERE]    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)

2013-04-03 19:30:30 [SEVERE]    at java.io.ObjectOutputStream.writeObject0(Unknown Source)

2013-04-03 19:30:30 [SEVERE]    at java.io.ObjectOutputStream.writeObject(Unknown Source)

2013-04-03 19:30:30 [SEVERE]    at me.bubblegumsoldier.Ban.Main.save(Main.java:113)

2013-04-03 19:30:30 [SEVERE]    at me.bubblegumsoldier.Ban.Main.onDisable(Main.java:247)

2013-04-03 19:30:30 [SEVERE]    at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:219)

2013-04-03 19:30:30 [SEVERE]    at org.bukkit.plugin.java.JavaPluginLoader.disablePlugin(JavaPluginLoader.java:481)

2013-04-03 19:30:30 [SEVERE]    at org.bukkit.plugin.SimplePluginManager.disablePlugin(SimplePluginManager.java:400)

2013-04-03 19:30:30 [SEVERE]    at org.bukkit.plugin.SimplePluginManager.disablePlugins(SimplePluginManager.java:393)

2013-04-03 19:30:30 [SEVERE]    at org.bukkit.craftbukkit.v1_5_R2.CraftServer.disablePlugins(CraftServer.java:277)

2013-04-03 19:30:30 [SEVERE]    at net.minecraft.server.v1_5_R2.MinecraftServer.stop(MinecraftServer.java:331)

2013-04-03 19:30:30 [SEVERE]    at net.minecraft.server.v1_5_R2.MinecraftServer.run(MinecraftServer.java:438)

2013-04-03 19:30:30 [SEVERE]    at net.minecraft.server.v1_5_R2.ThreadServerApplication.run(SourceFile:573)

我的保存代码如下:

变量:

public static HashMap banned = new HashMap();

保存部分:

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));

oos.writeObject(banned);

oos.flush();

oos.close();

错误是什么?

它给你什么错误?transient表示不应序列化该属性。

错误信息是什么?复制并粘贴到你的问题中。您可能需要添加一个公共的默认构造函数。

有关瞬态变量,请参阅以下内容:-stackoverflow.com/questions/5245600/…

此处可找到transient定义链接

似乎您已经将ban定义为另一个名为main的类的非静态内部类:

public class Main {

class Ban {

...

}

}

这意味着每个BAN实例都有一个对其外部主实例的隐式引用。以上代码与以下代码类似:

public class Main {

static class Ban {

private Main main;

}

}

或公共类主{}

class Ban {

private Main main;

}

所以当您序列化一个BAN时,您也在序列化这个隐式实例,它是不可序列化的,因此是异常的。

使ban成为顶级类或静态内部类。

发布的禁令类没有任何问题。可能错误是由类产生的,其中包含一个不可序列化的主字段变量。但问题中发布的代码可以序列化;我们可以运行以下代码:

公共类禁止实现可序列化{

transient Date start;

transient Date end;

String explination;

String from;

public Ban(Date s, Date e, String ex, String f) {

start = s;

end = e;

explination = ex;

from = f;

}

public String toString() {

return"Ban{" +"start=" + start +", end=" + end +", explination=" + explination +", from=" + from + '}';

}

public static void main(String[] args) throws IOException, ClassNotFoundException {

Ban x = new Ban(new Date(), new Date(),"Transient means do not serialize.","Thorn");

File f = new File("test.out");

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));

out.writeObject(x);

out.close();

ObjectInputStream in = new ObjectInputStream(new FileInputStream(f));

Ban fromFile = (Ban) in.readObject();

System.out.println(fromFile);

in.close();

}

}

产生的输出为:

Ban{start=null, end=null, explination=Transient means do not serialize., from=Thorn}

注意,输出的两个日期都为空,即使我给了它们值。未序列化临时值。

但是错误在哪里呢

我运行代码时没有出错。如果我得到与您相同的异常,那么粘贴到我的答案中的输出将不会被生成。尝试复制和粘贴我的代码并运行它。

transient字段没有序列化,它们将在从流中读取后成为null。这个错误似乎来自一个名为Main的内部类,它在代码示例中丢失了,并且没有实现Serializable!

无法序列化临时变量。

你能解释一下这是怎么回事/为什么吗?

Tyror是专门创建的Java关键字,用于从序列化中排除变量。移除它,您就可以潜在地序列化一个变量。有很多初学者介绍这个话题,试试贝茨和塞拉的SCJP书。

Java中的n& nbsp关键字用于指示字段不应该序列化。请参阅这篇文章,了解Java为什么有瞬态字段?

如果没有你的错误,我们无法帮助你。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值