反序列化需要铸造?

时间:2009-04-22 17:11:16

标签: c# .net xml serialization

我正在阅读this文章,其中包含以下代码:

// Serialization
XmlSerializer s = new XmlSerializer( typeof( ShoppingList ) );
TextWriter w = new StreamWriter( @"c:\list.xml" );
s.Serialize( w, myList );
w.Close();

// Deserialization
ShoppingList newList;
TextReader r = new StreamReader( "list.xml" );
newList = (ShoppingList)s.Deserialize( r );

最后一行是演员陈述吗?如果是这样,它是否会降低序列化性能?

5 个答案:

答案 0 :(得分:6)

是的,最后一行是演员陈述。铸造确实具有与之相关的成本,但与序列化的成本相比,它是无关紧要的。我怀疑它甚至会出现在探查器上。

考虑序列化涉及的内容。

  • 处理字节流
  • 基于元数据信息创建类型
  • 字节数组和数据类型之间的转换

任何这些操作都比单个施法操作贵得多。

编辑至于为何需要施法。

这里有几个原因。第一个是反序列化API在检查之前无法知道字节流的类型。因此,API在元数据中的返回类型方面唯一的选择是Object。

其次,反序列化必须支持任何可序列化的类型。为了起作用,它必须选择适用于所有可序列化类型的方法的返回类型。唯一可用的类型是对象。

答案 1 :(得分:3)

与反序列化成本本身相比,演员阵容非常便宜。反序列化的过程非常复杂 - 单个(工作)演员阵容几乎不需要任何时间。

当然,如果您对具有良好版本控制故事的快速,便携,紧凑的序列化感兴趣,那么您应该关注协议缓冲区:

(还有其他序列化框架,例如Thrift。)

答案 2 :(得分:1)

Deserialize()方法返回一个对象,必须“强制转换”为正确的类型。

Casting主要告诉编译器您知道对象类型是什么,因为编译器无法推断其类型。如果类型不是您指定的类型(或指定类型的子类型),运行时仍将生成InvalidCast异常。

铸造的实际成本很低。

答案 3 :(得分:0)

Deserialize返回一个Object类型,因此转换是为了让它进入正确的类。

是否会对反序列化产生任何影响,您希望它成为ShoppingList的一部分。

答案 4 :(得分:0)

如果您更改最后一行代码

newList = (ShoppingList)s.Deserialize( r );

newList = s.Deserialize( r );

编译器将在强制转换中添加回来。我刚刚用Red Gate的.NET Reflector证实了这一点。因此,无论铸造成本如何,如果要使用该类型对象,都需要执行此操作。

相关问题