我想从另一个已序列化的类中获取数据,但是得到的是“空” 我需要什么来获取数据?
//This is the serialized class
[Serializable]
public class User1
{
public string BB;
public void Start()
{
BB = "hello world";
}
}
//And This is the other class
public class A1 : MonoBehaviour
{
User1 user = new User1();
public void OnMouseDown()
{
Debug.Log(user.BB);
}
}
答案 0 :(得分:0)
我认为您误解了[Serializable]
概念。
该属性的含义是:
表示可以序列化一个类。
https://docs.microsoft.com/en-us/dotnet/api/system.serializableattribute?view=netframework-4.8
在您的代码中,仅创建User1
的新实例。
以下是其工作方式的示例(快速而肮脏的方式):
User1 user1 = new User1();
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(@"E:\user1.txt",FileMode.Create,FileAccess.Write);
formatter.Serialize(stream, user1);
stream.Close();
您将在文本文件中序列化User1
。
因此,现在您可以在程序的其他位置反序列化:
stream = new FileStream(@"E:\useri1.txt",FileMode.Open,FileAccess.Read);
User1 myuser1 = (User1)formatter.Deserialize(stream);
答案 1 :(得分:0)
我想您误解了Start
。这是一条特殊的Unity消息,对于从MonoBehaviour
派生的类仅被“自动”调用。
Start
调用 user
。因此,其BB
的值将始终为null
。
您必须在某个地方调用user.Start()
,例如
public class A1 : MonoBehaviour
{
User1 user = new User1();
private void Start()
{
user.Start();
}
public void OnMouseDown()
{
Debug.Log(user.BB);
}
}
自从您制作了类[Serializable]
之后,您可以简单地将字段user
设置为public
。如果类型为public
,则[Serializable]
字段将自动序列化。或者,如果您想保留它privte
(多数情况下,对于封装来说,它越来越干净)
[SerializeField] private User1 user;
因此它实际上将被序列化→显示在Unity Inspector中→用默认值""
初始化,然后您可以在Unity中轻松对其进行编辑。
(从那时起,通过代码分配的默认值不再有效,因为序列化的值将取代它们。)
否则,我建议您添加适当的构造函数,例如
[Serializable]
public class User1
{
// either initialize fields with a default value here
public string BB = "";
// Use the default constructor (= without parameters)
// if you implement other constructors the default constructor
// is always mandatory for serialization!
public User1()
{
BB = "hello world";
}
// use a specific constructor
public User1(string bb)
{
BB = bb;
}
}
现在您可以使用
User1 user = new User1();
因此它将有user.BB = "hello world"
或者您可以使用
User1 user = new User1("Example");
因此它将有user.BB = "Example"
如果您甚至需要使其可序列化,那就值得怀疑了。