我希望这不是一个重复的问题。 我有一个这样的课:
[Serializable]
class MyClass
{
int type;
List <FileStream> listfile;
string content_text;
public MyClass(int t)
{
type = t;
}
public MyClass()
{
type = 0;
}
}
我需要使用方法Socket.Send(byte [])在Socket中发送Myclass的对象。 所以我要序列化这个对象。但是如果我添加[Serializable],FileStream也不可序列化,我得到一个异常运行时。 有人可以帮帮我吗? 非常感谢你。
答案 0 :(得分:0)
当你将Serializable添加到一个类时,它不会改变任何东西,它只是告诉CLR你的类可以被序列化。
由于这一点,任何属于对象的类并且默认情况下不是Serializable都不会被更改,因此会导致您在尝试时看到的异常。
以下链接将向您显示Serializable属性的MSDN文档: 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 []'可以序列化而没有任何问题。
但是我会建议如果你要开始在套接字上发送任意长度的byte []数组,你会看到使用二进制流协议(也许是Google Proto Buffers)而不是默认的文本序列化对象的盒子。