【问题标题】:Serialization - not working序列化 - 不工作
【发布时间】:2025-12-07 17:50:01
【问题描述】:

我使用How to serialize an object into a string 之类的方法创建类 而且它每个人都说错误“java.lang.ClassCastException:java.lang.String 无法转换为 Myclass”

我的代码: 1)

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

import javax.xml.bind.DatatypeConverter;

public class Serialization {

    public static Object fromString(String s) throws IOException,
            ClassNotFoundException {
        byte[] data = DatatypeConverter.parseBase64Binary(s);
        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(
                data));
        Object o = ois.readObject();
        ois.close();
        return o;
    }

    public static String toString(Serializable o) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(o);
        oos.close();
        return DatatypeConverter.printBase64Binary(baos.toByteArray());
    }
}

2) - 调用

MyClass hl = (MyClass) Serialization.fromString(items
        .getString("data"));
hl.load(); // this is my method from class

3) MyClass - 全息图

public class Hologram implements Serializable {

 /**
 * 
 */
private static final long serialVersionUID = 1L;

private Location loc;
private String name;
private String displayname;
public ArmorStand stand;

public Hologram(String name, String displayname, Location loc) {
this.loc = loc;
this.name = name;
this.displayname = displayname;

ArmorStand as = (ArmorStand) loc.getWorld().spawnEntity(loc,
    EntityType.ARMOR_STAND);

as.setGravity(false);
as.setCanPickupItems(false);
as.setCustomName(displayname);
as.setCustomNameVisible(true);
as.setVisible(false);

this.stand = as;

HologramManager.holograms.put(name, this);

}

public void move(Location loc) {
this.loc = loc;

stand.teleport(loc);
}

public Location getLocation() {
return this.loc;
}

public void remove() {
stand.remove();
HologramManager.holograms.remove(name);
}

public void removeHologram() {
HologramManager.remove(name);
}

public void changeName(String name) {
HologramManager.holograms.remove(this.name);
this.name = name;
HologramManager.holograms.put(name, this);
}

public void changeDisplayName(String displayName) {
this.displayname = displayName;
stand.setCustomName(displayname);
stand.setCustomNameVisible(true);
}

public void load() {
//todo
}

}

【问题讨论】:

  • 请输入“MyClass”的代码。
  • 请发布一个简短但完整的程序来演示该问题。我们看不出你是如何想出开头的字符串的。 (我也强烈建议避免 Java 二进制序列化,但那是另一回事。)
  • 如果你想像那样反序列化,你需要将字节读回java.io.ObjectInputStreamreadObject()
  • 添加了 MyClass - 全息图

标签: java serialization


【解决方案1】:

序列化中的 fromString() 方法返回一个对象,您无法将其强制转换为 MyClass 类。下面的行导致了 classCastException

MyClass hl = (MyClass) Serialization.fromString(items
    .getString("data"));

【讨论】:

  • 您对解决方案有何建议?
  • 我不知道如何修复它
  • 读取一个对象,对象 obj = Serialization.fromString(items .getString("data"));。由你决定用它做什么;)
【解决方案2】:

根据链接的答案,问题很可能在于您没有向我们展示的代码。当你序列化你的 MyClass 对象时,你可能正在做这样的事情:

MyClass hl;
String base64String = Serialization.toString(hl.toString());

不过你应该这样称呼它:

MyClass hl;
String base64String = Serialization.toString(hl);

如果将String 传递给序列化函数,则在调用Serialization.fromString() 时将返回String。您想取回一个可以转换为 MyClass 实例的对象,因此将其中一个传递给 Serialization.toString()

【讨论】:

  • 谢谢你,现在它说 java.io.NotSerializableException: org.bukkit.Location - 现在怎么办?
  • 使 Location 类实现 Serializable 类。
  • 除了使 Hologram 类实现 Serializable 之外,所有成员变量也需要实现它。您可以将它们子类化并实现可序列化,或者如果它们不需要序列化,则将它们声明为瞬态
  • 一个位置是另一个库中的现有类(spigot[bukkit])
  • 能否子类化并在子类中实现Serializable?