Как я могу сериализовать 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), а не текстовые сериализованные объекты по умолчанию, которые вы получаете из коробки.,