对于下面的代码段,可能不需要向能够回答我问题的人解释:
protected readonly List<TEntity> Records; //Within the class declared.
protected virtual void ReadFile()
{
//So the file exists, is not null and not whitespace only
var serializer = new XmlSerializer(Records.GetType());
using (var reader = new StringReader(contents))
{
var records = (List<TEntity>)serializer.Deserialize(reader);
Records.Clear();
Records.AddRange(records);
}
}
关于这一行:
var records = (List<TEntity>)serializer.Deserialize(reader);
(1)我怎么知道(推断)这个演员阵容是可能的?我查看Deserialize()方法返回类型“object”。所以这不是暗示。 (编辑:我的意思是在编码/设计时间。之后没有为了试验和错误而编译。所以想想目标明确:目标=将xml数据存储到列表中&lt;&gt;。是否可以通过简单的演员(是的)以及如何我事先知道了吗?) (2)我怎么能/我可以推断出(d)变量“记录”最终会如何? 例如,什么不应该让我认为只有一个条目写入列表并且单个索引包含所有XML内容? (而不是在将其写入列表时保持良好的结构)
我的问题的最终目标是了解何时需要此类演员以及尤其 实际演员的理解方式。我愿意通过练习和实验来努力。但我不知道怎么想。
a)我是初学者,虽然快速学习i.m.o. b)我已阅读并理解隐式/显式转换并理解它基于范围而不是数据大小。但是这些教程限制内置基本类型,如int,float,decimal(你可以命名)。现在这个问题域(转换)我想移到更高的层次。
答案 0 :(得分:3)
演员
var records = (List<TEntity>)serializer.Deserialize(reader);
因
而起作用 new XmlSerializer(Records.GetType());
从对象到任何东西的强制转换将始终编译,但在类型不匹配时会产生运行时异常。
序列化程序从其构造函数中了解根类型,并将创建该类型的结果。如果XML与之不匹配,则会引发错误。您不能使用此反序列化单个TEntity,只能使用List&lt;&gt;有0个或更多元素。
您可以轻松验证:
object temp = serializer.Deserialize(reader);
// print or inspect temp.GetType() here
var records = (List<TEntity>)temp;
请注意,如果将XmlSerialzier设计为泛型类型,则不需要强制转换:
var serializer = new XmlSerializerGeneric<List<TEntity>>();
var records = serializer.Deserialize(reader);
但事实并非如此,它通过System.Object类使用旧的“动态类型”方式。
答案 1 :(得分:1)
如果不是这个,那将是非常明显的
var serializer = new XmlSerializer(Records.GetType());
你用过这个
var serializer = new XmlSerializer(typeof(List<TEntity>));
规则很简单。您传递给XmlSerializer
构造函数的类型,您可以安全地将Deserialize
结果转换为类型。
需要强制转换,因为XmlSerializer
(以及Enum
和许多其他框架类)在添加泛型之前的很长一段时间内都存在,因此返回object
是唯一的它的选择。由于向后兼容性(不破坏你编写的现有代码),它必须保持这种方式。
答案 2 :(得分:0)
我怎么能知道(推断)这种演员是否可能?
一种方法是使用调试器。在设置Records.Clear();
之后,在records
行上设置断点。然后在Watch窗口或Locals窗口中,查看records
变量的类型。它可能会这样说:
object { List<TEntity> }
records
是List<TEntity>
,但它作为对象传递,因为对serializer.Deserialize(reader)
的调用会返回一个对象。如果您没有声明从对象到List<TEntity>
的隐式转换,则必须使用显式转换。
除了最明显的情况外,我建议不要进行隐式转换。
答案 3 :(得分:0)
(1)我怎么知道(推断)这个演员阵容是可能的?
一切都从这里开始,
protected readonly List<TEntity> Records;
您不必推断,但您已经知道您正在从具有某种XML结构的文件中读取文件内容,并且由于您使用的是您之前知道的列表,因此将会有多个列表项
我查看了
Deserialize()
方法返回的类型 “宾语”。所以这不是暗示。
对象类不是直接使用的(所以基本上这是一个必须要强制转换的提示)并且必须先将其转换为某种类型(在本例中为List<TEntity>
)才能使用它。
(2)我怎么能/我可以推断出(d)变量“记录”将如何结束 吗?
假设我想创建人员列表,我知道我会保留一些结构,例如,
我有以下XML
<persons>
<person>
<name>Chuck Norris</name>
<age>137</age>
</person>
<person>
<name>Donald Trump</name>
<age>19</age>
</person>
<persons>
您知道您希望获得您的列表将被声明为此人的记录,List<Person>
。您知道Deserialize()方法返回对象,您希望读取人员数据,您可以将该对象转换为List<Person>
。基本上我要说的是,你提出的问题都是基于你在申请设计时做出的假设和选择。