反序列化在Unity中性能降低

时间:2015-10-02 08:57:58

标签: c# serialization unity3d deserialization binaryformatter

我在Unity制作3D模拟器。
对于这个模拟器,我需要一些存储在Serializable对象中的数据。
这个对象在我制作的DLL文件中定义 我用这段代码反序列化它:

public class myObject
{
    static public myObject LoadFromFile(String Path)
    {
        System.Runtime.Serialization.Formatters.Binary.BinaryFormatter BF = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
        System.IO.FileStream FS = new System.IO.FileStream(Path, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);
        myObject Result = BF.Deserialize(FS) as myObject;
        FS.Close();
        return Result;
    }
}

我的团结程序引用了包含' myObject'的定义的类库。
如果我从Unity运行反序列化功能,则此过程需要35.080秒。

如果我在我为测试目的而创建的Windows应用程序中运行它并且引用相同的类库并打开相同的文件,则此过程仅需0.260秒。

即使我异步运行此过程,在Unity中也需要很长时间。

我想知道为什么从Unity运行此代码需要更长的时间? 如果我能做些什么呢?

提前致谢,
马腾

2 个答案:

答案 0 :(得分:1)

我不知道为什么会发生这种情况,但你可以尝试的一件事是实现ISerializable接口,自己序列化你的成员,看看团结是否仍然很慢。

您需要实现GetObjectData以及采用SerializationInfo和StreamingContext的受保护构造函数。 GetObjectData用于将对象放在序列化流上,构造函数用于......嗯......构建。

public class MyObject : ISerializable
{
  private bool somemember;

  protected Complaint(SerializationInfo info, StreamingContext context)
  {
    somemember = info.GetBoolean("b");
  }

  [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
  public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
  {
    info.AddValue("b", somemember);
  }
}

希望这有帮助!

答案 1 :(得分:0)

我不完全理解你的问题。您要访问的类是在.dll文件中?如果是这样 - 您的类定义位于何处并不重要。您的数据存储在何处以及如何存储?如果要将数据永久存储在硬盘驱动器上,可以轻松使用Json.NET并将数据存储为.json文件。从哪种方法以及何时尝试将数据加载到统一内部?

此外,如果你打开一个文件流,你也应该在完成阅读后再次关闭它。您还可以查看一些编码约定,例如here