2013-11-11 2 views
2

У меня есть определение класса в отдельной сборке. Класс помечается как сериализации:FileStream не помечен как сериализуемый, но весь класс?

namespace example 
{ 
    [Serializable] 
    public class my_class 
    { 
     public List<string> text; 
     public FileStream audio; 

     public Image img; 
     public string nickname; 
    } 
} 

я могу загрузить эту сборку и создать экземпляр этого класса без проблем. Но когда я пытаюсь бросить в байт [] с помощью кода ниже

private byte[] ToByteArray() 
{ 
    if (send == null) // 'send' is a my_class instance; 
     return null; 

    BinaryFormatter bf = new BinaryFormatter(); 
    bf.Binder = new Binder(); 
    bf.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full; 
    bf.Binder.BindToType(example_assembly.FullName, "my_class"); 
    MemoryStream ms = new MemoryStream(); 
    bf.Serialize(ms, send); 
    return ms.ToArray(); 
} 

я получаю:

System.Runtime.Serialization.SerializationException -> Тип System.IO.FileStream в mscorlib Ассамблеи», версия = 4.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089 'не помечен как сериализуемый.

Я не понимаю этого, потому что весь класс помечен как сериализуемый. Любые sugestions ??

+0

Да, * ваш * класс помечен как сериализуемый, но являются ли каждый из * членов * также сериализуемым? (IE: 'FileStream') – sircodesalot

+0

В качестве побочного примечания: я действительно не рекомендую BinaryFormatter - я видел, как слишком много людей сильно укусались (обычно при управлении версиями) –

ответ

2

Атрибут Serializable просто указывает, что класс может быть сериализован. Он не изменяет базовые функции класса. Вы можете пометить несериализуемые классы и члены как сериализуемые.

A FileStream не является сериализуемым. Пометить его как таковое не изменит.

http://msdn.microsoft.com/en-us/library/system.serializableattribute(v=vs.110).aspx

+0

Большое спасибо, и это решило мою проблему. – user2981093

+0

Кроме того, рассмотрите использование блоков 'using' вокруг ваших' streams'. Вы хотите, чтобы они убирались. – andleer

0

Пользователи сериализуемы, но их типы также должны быть сериализации. FileStream нет. Вы можете реализовать интерфейс ISerializable в своем классе и manully serialize audio/img.

0

Проблема в том, что my_class украшен [SerializableAttribute], но класс FileStream нет. =/

Вы можете пропустить сериализацию свойств, украсив свойство FileStream [NonSerializedAttribute], но вы не можете сериализовать файл Stream.

Это не очень красиво, но этот парень here и here преобразовал поток в строку. Вы можете управлять сериализацией своего класса, реализовав интерфейс ISerializale и проанализируя FileStream на то, что является Serializable.

Смежные вопросы