【问题标题】:How to determine which classes are serializable如何确定哪些类是可序列化的
【发布时间】:2010-08-16 14:32:48
【问题描述】:

我正在更改我的 ASP.NET 应用程序以使用网络场。为此,我需要将会话状态从进程内更改为状态服务器。为此,我的理解是必须将使用的类标记为可序列化。你怎么知道在课堂上是否可以做到这一点?如果不可能,编译时会报错吗?

【问题讨论】:

  • 可能是重复的。不过,原贴也想知道如果你尝试序列化无法序列化的东西会发生什么。
  • 你能选择一个有帮助的答案吗,或者如果你想出了另一个答案,你可以发布它并将其标记为答案吗?谢谢!

标签: asp.net serialization


【解决方案1】:

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

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

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

因此,我建议您至少对尝试序列化自定义类时发生的情况进行一些初步测试。

【讨论】:

  • 这不是答案,而是评论。
【解决方案2】:

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

您可以编写一个简短的 sn-p 尝试序列化和反序列化相关对象...使用 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;
}

【讨论】:

  • 感谢您提供的信息。无论如何,是否有一个快速代码片段显示您使用 BinaryFormatter 和 FileStream 所指的内容?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 2020-03-02
相关资源
最近更新 更多