【发布时间】:2014-05-28 18:04:22
【问题描述】:
假设我有以下课程:
public abstract class ScheduledService : ScheduledServiceBase<ScheduledService>
{
public CronInfo CronInfo;
public String ServiceName;
public ScheduledService()
{ }
}
public abstract class ScheduledServiceBase<T>
{
public ScheduledServiceBase()
{ }
public virtual void StartUp(IScheduler scheduler, ScheduledService service, Dictionary<string, object> parameters = null)
{
...
}
}
从这个基类中,我创建了两个继承类,如下所示:
public AlphaService : ScheduledService
{
public String Alpha_Name;
public Int32 Alpha_Age;
public AlphaService() { }
}
public BetaService : ScheduledService
{
public String Beta_Company;
public Boolean Beta_IsOpen;
public AlphaService() { }
}
然后在我的 XML 中定义两个服务:
<ScheduledServices>
<AlphaService>
<Alpha_Name>John Jones</Alpha_Name>
<Alpha_Age>32</Alpha_Age>
<ServiceName>FirstService</ServiceName>
<CronInfo>0 0 0/2 * * ? *</CronInfo>
</AlphaService>
<BetaService>
<Beta_Company>Ajax Inc.</Beta_Company>
<Beta_IsOpen>Ajax Inc.</Beta_IsOpen>
<ServiceName>SecondService</ServiceName>
<CronInfo>0 30 0/5 * * ? *</CronInfo>
</BetaService>
</ScheduledService>
当我反序列化时,我试图将 ScheduledServices 分配给List<ScheduledService> ScheduledServices,但反序列化后列表中不存在任何内容。反序列化器不会出错,它只是不创建任何服务。
我正在尝试做的事情是否有效,或者我需要以不同的方式设置服务?
这是我用来反序列化 XML 的:
public Boolean Load(params Type[] extraTypes)
{
deserializedObject = default(T);
XmlTextReader reader = null;
try
{
reader = new XmlTextReader(new StreamReader(_actualPath));
XmlSerializer serializer = new XmlSerializer(typeof(T), extraTypes);
deserializedObject = (T)(serializer.Deserialize(reader));
}
catch (Exception ex)
{
log.Error("Error: " + ex.Message);
log.Debug("Stack: " + ex.StackTrace);
log.Debug("InnerException: " + ex.InnerException.Message);
}
finally
{
if (reader != null) reader.Close();
}
return ((this.deserializedObject != null) && deserializedObject is T);
}
解决方案
感谢 John Arlen 和他的示例以及指向另一篇文章的链接,我能够通过创建如下列表来做我想做的事情:
[XmlArrayItem("AlphaJob", Type=typeof(AlphaJob))]
[XmlArrayItem("BetaJob", Type=typeof(BetaJob))]
public List<ScheduledService> ScheduledServices;
【问题讨论】:
-
最后一段代码sn-p中实际实现的
T是什么类型?是List<ScheduledService>还是别的什么? -
@Codor 这将是像
这样的 XML 链更上层的东西。然后 MyConfiguration 类将有一个 List > ScheduledServices. -
您的意思是
MyConfiguration会有一个ScheduledServices类型为List<ScheduledService<T>>的成员?T的论据是什么?请给出定义。 -
@Codor
是我所坚持的。我想我可以做一个 List > ,其中 T 由继承类定义(即,在“public AlphaService : ScheduledService”中,T 将是 AlphaService)
标签: c# xml deserialization