首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按Play键后不同列表中的统一序列化对象不相等

按Play键后不同列表中的统一序列化对象不相等
EN

Stack Overflow用户
提问于 2018-06-24 19:28:54
回答 2查看 127关注 0票数 2

简单地说,我有以下清单:

代码语言:javascript
复制
[System.Serializable]
public class PatrolGraph : MonoBehaviour {

public List<Node> nodes = new List<Node>();
public List<Edge> edges = new List<Edge>();
[...]
}

我使用从编辑器运行的方法生成两个列表(节点和边)。节点和边缘都是可序列化的,边缘包含两个节点。但是,在我点击play之后,保存在边缘列表边缘对象中的节点似乎与我的节点列表(NodeA.Equals(NodeB))中的节点不一样,尽管它们应该是相同的。如果我运行函数以在播放模式(在编辑模式下运行的相同)生成列表,那么Equals函数突然返回true。

以下是Node和Edge类的代码:

节点:

代码语言:javascript
复制
[System.Serializable]
public class Node
{
public float lastVisited = 0;
public Vector3 position;
}

边缘:

代码语言:javascript
复制
[System.Serializable]
public class Edge
{
public Node A;
public Node B;

public Edge (Node A, Node B)
{
    this.A = A;
    this.B = B;
}
}

我希望边缘对象中的节点A和B与我点击play后保存在节点列表中的节点相同。我做错了什么?

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-30 13:28:28

正如Kacper所提到的,在使用序列化时不可能保存引用。反序列化之后,在多个变量中引用的节点将为每个变量产生独立的实例,并在对这些实例使用时使等于函数返回false。

不过,我还是设法通过向节点添加id来保存节点之间的边,这些节点表示它们的列表索引。

代码语言:javascript
复制
for (int i = 0; i< nodes.Length; i++){
nodes[i].id = i;
}

边只保存节点的索引/ids,而不是引用节点本身。

代码语言:javascript
复制
public class Edge
{
public int id_1;
public int id_2;
}

解决了问题。

票数 0
EN

Stack Overflow用户

发布于 2018-06-24 20:15:34

这是因为Object.Equals只在EdgeNode是引用类型时检查引用。而序列化使用新地址创建新对象,这就是为什么Equals返回false的原因。如果您重写此方法以检查字段的值,它将解决您的问题。我建议检查MSDN以了解如何重写等于的进一步信息。或回答在论坛上与团结社区:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51013288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档