我正在阅读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 );
最后一行是演员陈述吗?如果是这样,它是否会降低序列化性能?
答案 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证实了这一点。因此,无论铸造成本如何,如果要使用该类型对象,都需要执行此操作。