【问题标题】:How can i serialize a FileStream in c#?如何在 C# 中序列化 FileStream?
【发布时间】:2014-10-04 13:57:34
【问题描述】:

我希望这不是一个重复的问题。 我有这样的课:

    [Serializable]
    class MyClass
    {
       int type;
       List <FileStream> listfile;
       string content_text;
       public MyClass(int t)
    {
        type = t;
    }

       public MyClass()
    {
           type = 0;
    }       
    }

我需要使用 Socket.Send(byte []) 方法在 Socket 中发送 Myclass 的对象。 所以我必须序列化这个对象。但是,如果我添加 [Serializable],FileStream 不是可序列化的,并且我会得到一个异常运行时。 有人可以帮助我吗? 非常感谢。

【问题讨论】:

  • 你得到什么异常?
  • 流表示任意长度的字节集合。您可以将其序列化为字节数组,但如果文件非常大,它可能实际上不适合内存。您最好创建一个协议来使用一系列固定大小的缓冲区传输来传输内容,并将其存储为另一端的文件,该文件可以在那里作为流打开和读取。如果它足够小,可以作为对象传输,则考虑更好地表示其内容。
  • 发送 FileStream 对象列表的目的是什么?无论如何,您都需要打开该文件。只需保留文件属性的列表(路径,FileMode ...)。

标签: c# serialization filestream


【解决方案1】:

当你将 Serializable 添加到一个类时,它不会改变任何东西,它只是告诉 CLR 你的类可以被序列化。

因此,作为对象一部分且默认情况下不可序列化的任何类都不会被更改,因此会导致您在尝试更改时看到的异常。

以下链接将向您展示 Serializable 属性的 MSDN 文档: http://msdn.microsoft.com/en-us/library/system.serializableattribute(v=vs.110).aspx

但是,您可以使用“NonSerializedAttribute”将类中的各个属性标记为不可序列化,如下所示:

[Serializable]
class MyClass
{
  int type;

  [NonSerialized]
  List<FileStream> listfile;

  string content_text;
  public MyClass(int t)
  {
    type = t;
  }

  public MyClass()
  {
    type = 0;
  }
}

这将防止异常发生,但它会通过从序列化输出中删除实际属性来做到这一点,这意味着如果你想通过你的套接字传递文件流对象,那么不幸的是你的运气很差,因为你只是没有会的。

现在,也就是说,您可以尝试将文件流的内容读入字节数组,然后您可以轻松地发送这些字节数组,因为 'byte[]' 是可序列化的,没有任何问题。

但是,我建议如果您要开始通过套接字发送任意长度的 byte[] 数组,那么您应该考虑使用二进制流协议(可能是 Google Proto Buffers)而不是默认的文本序列化对象盒子。

【讨论】:

  • 谢谢大家!我会尝试将我的 FileStream 的内容放在一个字节数组中,然后发送。
猜你喜欢
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
相关资源
最近更新 更多