如何确定哪些类是可序列化的

时间:2010-08-16 14:32:49

标签: asp.net serialization

我正在更改我的ASP.NET应用程序以使用Web场。为此,我需要将会话状态从进程内更改为状态服务器。为此,我理解所使用的类必须标记为可序列化。你如何判断一个班级是否可以这样做?如果不可能,你会在编译时遇到错误吗?

2 个答案:

答案 0 :(得分:1)

在回答您关于如何判断某个类是否可序列化的第一个问题时,请参阅以下讨论。 How to check if an object is serializable in C#

不幸的是,当我尝试序列化我认为应该可序列化的对象时,.net让我感到惊讶。

例如,在我的WCF项目中,我可以序列化并传输DataSet个对象。但是,如果我尝试序列化并传输DataTable个对象,我最终会得到一个空白DataTable。我花了一段时间跟踪那个。

因此,我建议您至少对尝试序列化自定义类时会发生什么进行一些基本测试。

答案 1 :(得分:1)

您不会得到编译时异常,因为编译时并不真正知道对象是否需要序列化。当IIS尝试序列化您的对象时,您将获得SerializationException

您可以编写一个简短的代码段,尝试序列化和反序列化相关对象...使用BinaryFormatter进行序列化,并使用FileStream进行写入。

ObjectBrowser会告诉您现有的类是否实现了ISerializable。如果您正在查看自己的序列化对象,请记住,如果要对序列化进行序列化,则必须真正设计类,否则会有问题。例如,来自MSDN帮助:

  

无法保证对象反序列化的顺序。例如,如果一个类型引用了尚未反序列化的类型,则会发生异常。

我建议您阅读ISerializable ...这是一个链接:http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.aspx


编辑:这是一个序列化和反序列化的简单示例...只需用我自己的对象替换Exception我序列化:

BinaryFormatter formatter = new BinaryFormatter();

Exception serializedException = new Exception("Testing serialization");
Exception deserializedException;

using (FileStream fileStream = new FileStream(@"C:\SerializationTest.txt", FileMode.CreateNew)) {
    formatter.Serialize(fileStream, serializedException);
}

using (FileStream readStream = new FileStream(@"C:\SerializationTest.txt", FileMode.Open)) {
    deserializedException = formatter.Deserialize(readStream) as Exception;
}

if (deserializedException != null) {
    throw deserializedException;
}