Как я могу сериализовать FileStream в C#?

Я надеюсь, что это не повторный вопрос. У меня есть такой класс:

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

       public MyClass()
    {
           type = 0;
    }       
    }

Мне нужно отправить объект Myclass в Socket с помощью метода Socket.Send(byte []). Так что я должен сериализовать этот объект. Но также, если я добавлю [Serializable], FileStream не будет сериализуемым, и я получу исключительную среду выполнения. Кто-то может мне помочь? Большое спасибо.

1 ответ

Когда вы добавляете Serializable в класс, он ничего не меняет, он просто сообщает CLR, что ваш класс может быть сериализован.

Из-за этого любые классы, которые являются частью объекта и не являются Serializable по умолчанию, не будут изменены в любом случае, и как таковые вызовут исключение, которое вы видите при попытке.

Следующая ссылка покажет вам документацию MSDN для атрибута Serializable: 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[]' сериализуем без каких-либо проблем.

Тем не менее, я бы порекомендовал, если вы собираетесь отправлять байты [] массивов произвольной длины через сокет, вы должны использовать двоичный потоковый протокол (возможно, Google Proto Buffers), а не текстовые сериализованные объекты по умолчанию, которые вы получаете из коробки.,

Другие вопросы по тегам