如何从序列化类C#获取数据?

时间:2019-08-07 17:09:02

标签: c# unity3d serialization

我想从另一个已序列化的类中获取数据,但是得到的是“空” 我需要什么来获取数据?

//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);

    }
}

2 个答案:

答案 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"

如果您甚至需要使其可序列化,那就值得怀疑了。