如何在c#中序列化FileStream?

时间:2014-10-04 13:57:35

标签: c# serialization filestream

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

    [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也不可序列化,我得到一个异常运行时。 有人可以帮帮我吗? 非常感谢你。

1 个答案:

答案 0 :(得分:0)

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

由于这一点,任何属于对象的类并且默认情况下不是Serializable都不会被更改,因此会导致您在尝试时看到的异常。

以下链接将向您显示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)而不是默认的文本序列化对象的盒子。