gpt4 book ai didi

java - 在数据传输中反序列化后不是同一个对象

转载 作者:行者123 更新时间:2023-12-04 05:39:10 25 4
gpt4 key购买 nike

我真的需要一些帮助...

我正在处理 Jtree 中的拖放事件.
我创建了一个 TransferHandler管理拖放。

来源:KineticsTransferHandler.java

package tree;

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;

import javax.swing.JComponent;
import javax.swing.JTree;
import javax.swing.TransferHandler;
import javax.swing.tree.TreePath;

import datastructures.base.Acquisition;
import datastructures.base.Kinetics;
import datastructures.base.Location;

public class KineticsTransferHandler extends TransferHandler{
private static final long serialVersionUID = -5653477841078614666L;

final public static DataFlavor ACQUISITION_NODE = new DataFlavor(Acquisition.class, "Acquisition Node");

static DataFlavor flavors[] = { ACQUISITION_NODE };

@Override
public int getSourceActions(JComponent c) {
return MOVE;
}

@Override
protected Transferable createTransferable(JComponent c) {
JTree tree = (JTree) c;
TreePath path = tree.getSelectionPath();

System.out.println(tree.getSelectionPath().toString());

if (path != null) {
Object o = path.getLastPathComponent();
if(o instanceof Acquisition) {
return new AcquisitionTransferable((Acquisition)o);
}
}
return null;
}

@Override
protected void exportDone(JComponent source, Transferable data, int action) {
if(action != NONE) {
JTree tree = (JTree) source;
StudyTreeModel model = (StudyTreeModel)tree.getModel();
model.printStudy();

tree.updateUI();
}
}

@Override
public boolean canImport(TransferHandler.TransferSupport support) {
boolean canImport = false;
if (support.isDrop()) {
Acquisition source = null;

if (support.isDataFlavorSupported(ACQUISITION_NODE)) {
try {
source = (Acquisition) support.getTransferable().getTransferData(ACQUISITION_NODE);
} catch (UnsupportedFlavorException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

if(source != null) {
JTree.DropLocation dropLocation = (JTree.DropLocation)support.getDropLocation();
Object dest = dropLocation.getPath().getLastPathComponent();
canImport = sameLocation(source, dest);
}
}
}
return canImport;
}

/*Verifies that the source and the dest are in the same Location*/
private boolean sameLocation(Acquisition source, Object dest) {
/*...
A method to check if the source has the same Location than the dest.
...*/
}

@Override
public boolean importData(TransferHandler.TransferSupport support) {
boolean importData = false;
if (canImport(support)) {
Acquisition source = null;

if (support.isDataFlavorSupported(ACQUISITION_NODE)) {
try {
source = (Acquisition) support.getTransferable().getTransferData(ACQUISITION_NODE);
((StudyTree)support.getComponent()).gettr
} catch (UnsupportedFlavorException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}

JTree.DropLocation dropLocation = (JTree.DropLocation)support.getDropLocation();
Object dest = dropLocation.getPath().getLastPathComponent();

int childIndex = dropLocation.getChildIndex();
if (sameLocation(source, dest)) {// dest and source get the same Location
/*...
Management of the drop according to the dest.
...*/
}
}
return importData;
}

public class AcquisitionTransferable implements Transferable {
Acquisition acquisition;

public AcquisitionTransferable(Acquisition s) {
acquisition = s;
}

@Override
public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException {
if (!isDataFlavorSupported(flavor))
throw new UnsupportedFlavorException(flavor);
return acquisition;
}

@Override
public DataFlavor[] getTransferDataFlavors() {
return flavors;
}

@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return ACQUISITION_NODE.equals(flavor);
}
}
}

它使用 Transferable对于我调用的数据传输 AcquisitionTransferable (正如你在最后看到的)。

我的问题来自这部分

来源: KineticsTransferHandler.canImport(TransferHandler.TransferSupport)
source = (Acquisition) support.getTransferable().getTransferData(ACQUISITION_NODE);

最后,我在 source 中的结构(上面的那个)就像一个真实的副本。我调试的时候可以看到 source的ID与真实ID不一样。

但在 support ( KineticsTransferHandler.canImport(TransferHandler.TransferSupport) 的参数),我有我的 Jtree其中包含结构,这是好的。

所以,我在想的是, getTransferData中结构的访问存在问题。 ,可能是序列化有问题。当我访问我的结构时, getTransferData反序列化结构,这就是为什么我变得像它的克隆。

你知道我应该如何修复它吗?

最佳答案

您需要定义您的 DataFlavorjavaJVMLocalObjectMimeType , 表示传输的数据驻留在本地 JVM 中。在您的情况下,DataFlavor定义应如下所示:

final public static DataFlavor ACQUISITION_NODE = 
new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType+"; class=\"" +Acquisition.class.getCanonicalName()+"\""
,"Acquisition Node");

检查其他两个 Java 对象 MIME 类型 here还有。

关于java - 在数据传输中反序列化后不是同一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11505704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com