C# 使用IEnumerators检查反序列化的进度

C# 使用IEnumerators检查反序列化的进度,c#,unity3d,deserialization,binaryformatter,C#,Unity3d,Deserialization,Binaryformatter,我想创建一个反序列化过程,其中包括进程本身。 所以可能是某种IEnumerator在每帧更新我的进度字段。 在格式化程序读取文件时,是否可以跟踪格式化程序的位置 当我反序列化大文件时,我想知道它是如何进行的。我认为最简单的方法是通过包装正在反序列化的流并在格式化程序读取它时跟踪位置来近似实现 public static object Deserialize(string path) { using (Stream stream = File.Open(path, FileMode.Ope

我想创建一个反序列化过程,其中包括进程本身。 所以可能是某种IEnumerator在每帧更新我的进度字段。 在格式化程序读取文件时,是否可以跟踪格式化程序的位置


当我反序列化大文件时,我想知道它是如何进行的。

我认为最简单的方法是通过包装正在反序列化的流并在格式化程序读取它时跟踪位置来近似实现

public static object Deserialize(string path)
{
    using (Stream stream = File.Open(path, FileMode.Open))
    {
        BinaryFormatter bformatter = new BinaryFormatter();
        return bformatter.Deserialize(stream);
    }
}
SomeClass someObject = (SomeClass)Deserialize(savePath);

我认为最简单的方法是通过包装正在被反序列化的流并在格式化程序读取时跟踪位置来近似实现

public static object Deserialize(string path)
{
    using (Stream stream = File.Open(path, FileMode.Open))
    {
        BinaryFormatter bformatter = new BinaryFormatter();
        return bformatter.Deserialize(stream);
    }
}
SomeClass someObject = (SomeClass)Deserialize(savePath);

我会远离BinaryFormatter来保存游戏数据。它非常脆弱,更新到新的Unity版本可能会破坏所有保存游戏。如果您想保持二进制格式,请坚持使用JSON格式的保存数据或使用不同于BinaryFormatter的第三方二进制序列化程序。我可以看出,这也不是很有效。。您认为我应该使用什么来高效地存储和加载一个包含超过100万个64位大小的类的数组(因此我估计超过200兆字节)?我推荐。然而,我不知道它与Unity一起使用有多容易,请参见。但是,如果您只是烧焦少数类型,那么也可以编写自己的序列化方法。只需添加一个
公共void序列化(流目标)
和一个
静态对象反序列化(流源)
到类型,并使用
BinaryReader
BinaryWriter
读取和写入这两种方法中的对象。您是否尝试过NFX.Serialization.Slim.SlimSerializer或MessagePack?MessagePack看起来很不错,我会尝试一下。我会远离
BinaryFormatter
来保存您的游戏数据。它非常脆弱,更新到新的Unity版本可能会破坏所有保存游戏。如果您想保持二进制格式,请坚持使用JSON格式的保存数据或使用不同于BinaryFormatter的第三方二进制序列化程序。我可以看出,这也不是很有效。。您认为我应该使用什么来高效地存储和加载一个包含超过100万个64位大小的类的数组(因此我估计超过200兆字节)?我推荐。然而,我不知道它与Unity一起使用有多容易,请参见。但是,如果您只是烧焦少数类型,那么也可以编写自己的序列化方法。只需添加一个
公共void序列化(流目标)
和一个
静态对象反序列化(流源)
到类型,并使用
BinaryReader
BinaryWriter
读取和写入这两个方法中的对象。您是否尝试过NFX.Serialization.Slim.SlimSerializer或MessagePack?MessagePack似乎很受欢迎,我会尝试一下
public static T Deserialize<T>(
  Stream stream, ProgressChangedEventHandler callback)
{
  using (ReadProgressStream rps = new ReadProgressStream(stream))
  using (BufferedStream bs = new BufferedStream(rps))
  {
    rps.ProgressChanged += callback;
    BinaryFormatter formatter = new BinaryFormatter();
    return (T)formatter.Deserialize(bs);
  }
}
public abstract class ContainerStream : Stream
    {
        private Stream _stream;

        protected ContainerStream(Stream stream)
        {
            if (stream == null) throw new ArgumentNullException("stream");
            _stream = stream;
        }

        protected Stream ContainedStream { get { return _stream; } }

        public override bool CanRead { get { return _stream.CanRead; } }

        public override bool CanSeek { get { return _stream.CanSeek; } }

        public override bool CanWrite { get { return _stream.CanWrite; } }

        public override void Flush() { _stream.Flush(); }

        public override long Length { get { return _stream.Length; } }

        public override long Position
        {
            get { return _stream.Position; }
            set { _stream.Position = value; }
        }

        public override int Read(byte[] buffer, int offset, int count)
        {
            return _stream.Read(buffer, offset, count);
        }

        public override long Seek(long offset, SeekOrigin origin)
        {
            return _stream.Seek(offset, origin);
        }

        public override void SetLength(long value)
        {
            _stream.SetLength(value);
        }

        public override void Write(byte[] buffer, int offset, int count)
        {
            _stream.Write(buffer, offset, count);
        }
    }