FileStream没有标记为可序列化,但整个类是?

时间:2013-11-11 23:32:27

标签: c# serializable

我在单独的程序集中有一个类定义。该类标记为可序列化:

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

        public Image img;
        public string nickname;
    }
}

我可以加载此程序集并创建此类的实例,没有任何问题。但是当我尝试使用代码bellow

转换为byte []时
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 - &gt;在Assembly'mscorlib中输入System.IO.FileStream,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'未标记为可序列化。

我不明白这一点,因为整个类被标记为可序列化。任何sugestions?

3 个答案:

答案 0 :(得分:3)

Serializable属性只表示可以序列化一个类。它不会更改类的基础功能。您可以将非可序列化的类和成员标记为可序列化。

FileStream不可序列化。将其标记为不会改变它。

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

答案 1 :(得分:0)

成员是可序列化的,但它们的类型也应该是可序列化的。 FileStream不是。您可以在类中实现ISerializable接口,并手动序列化audio / img字段。

答案 2 :(得分:0)

问题是my_class是用[SerializableAttribute]修饰的,但是FileStream类不是。 = /

您可以通过使用[NonSerializedAttribute]修饰FileStream属性来跳过属性序列化,但不能序列化文件Stream。

这不是很漂亮,但这个人herehere将流转换为字符串。您可以通过实现ISerializale接口来控制类的序列化,并将FileStream解析为Serializable。