2

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

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

        public Image img;
        public string nickname;
    }
}

我可以毫无问题地加载这个程序集并创建这个类的一个实例。但是当我尝试使用下面的代码转换为 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 -> 在程序集中输入 System.IO.FileStream 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 未标记为可序列化。

我不明白这一点,因为整个类都被标记为可序列化。有什么建议吗??

4

3 回答 3

4

Serializable属性只是表明一个类可以被序列化。它不会改变类的底层功能。您可以将不可序列化的类和成员标记为可序列化。

AFileStream不可序列化。将其标记为这样不会改变这一点。

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

于 2013-11-11T23:35:08.537 回答
0

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

于 2013-11-11T23:39:05.640 回答
0

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

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

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

于 2013-11-11T23:49:38.370 回答