主题:XML序列化:属性是class1类型:class1里面又有属性:如何把class1的属性也写入xml
我想把一个类序列化,但是其中有一个属性是一个类,里面包含其他的属性:
public abstract class ComponentBase
{
[ToSerialize]//这是我自己定义的一个attribute,用于标记是否将此字段序列化
public ComponentArgs Parameters { get; set; }
}
public class ComponentArgs
{
public string WorkingPath { get; set; }
public IList<Language> Languages { get; set; }
public string ComponentOutputPath { get; set; }
}
序列化以后的信息必须是放在dictionary<string,string>,即ComponentSetting[str_Name]=str_Value
中,读取这个setting用的是reflection,
pinfo: 用Type.GetProperties()得道的property info。
componentSettings.Add(pinfo.Name, pinfo.GetValue((object)this, null).ToString());
这样我得到的序列化以后的信息是
<Parameters>MS.STBIntl.Pippin.Framework.ComponentArgs</Parameters>
而无法得到ComponentArgs.WorkingPath等属性的值。
我想到的方法是把
componentSettings.Add(pinfo.Name, pinfo.GetValue((object)this, null).ToString());
附加一个判断,判断pinfo如果是ComponentArgs就改成这样:
componentSettings.Add(pinfo.Name, pinfo.GetValue(
(ComponentArgs)this, null).WorkingPath+"\n"+
LanguageList+"\n"+ //Language list是用循环生成的所有language元素的string的叠加。
(ComponentArgs)this, null).ComponentOutputPath+"\n"+
);
反序列化的时候,判断如果value中包含2个以上的“\n”,就用另一种算法把每个元素提取出来。
但是这种方法好像很笨,不知道有没有什么更专业一点的方法?我的上司要求很高,workaround一类的
解决方案总是不接受。但是如果您有任何的点子,不妨分享出来,我表示衷心地感谢。
public abstract class ComponentBase
{
[ToSerialize]//这是我自己定义的一个attribute,用于标记是否将此字段序列化
public ComponentArgs Parameters { get; set; }
}
public class ComponentArgs
{
public string WorkingPath { get; set; }
public IList<Language> Languages { get; set; }
public string ComponentOutputPath { get; set; }
}
序列化以后的信息必须是放在dictionary<string,string>,即ComponentSetting[str_Name]=str_Value
中,读取这个setting用的是reflection,
pinfo: 用Type.GetProperties()得道的property info。
componentSettings.Add(pinfo.Name, pinfo.GetValue((object)this, null).ToString());
这样我得到的序列化以后的信息是
<Parameters>MS.STBIntl.Pippin.Framework.ComponentArgs</Parameters>
而无法得到ComponentArgs.WorkingPath等属性的值。
我想到的方法是把
componentSettings.Add(pinfo.Name, pinfo.GetValue((object)this, null).ToString());
附加一个判断,判断pinfo如果是ComponentArgs就改成这样:
componentSettings.Add(pinfo.Name, pinfo.GetValue(
(ComponentArgs)this, null).WorkingPath+"\n"+
LanguageList+"\n"+ //Language list是用循环生成的所有language元素的string的叠加。
(ComponentArgs)this, null).ComponentOutputPath+"\n"+
);
反序列化的时候,判断如果value中包含2个以上的“\n”,就用另一种算法把每个元素提取出来。
但是这种方法好像很笨,不知道有没有什么更专业一点的方法?我的上司要求很高,workaround一类的
解决方案总是不接受。但是如果您有任何的点子,不妨分享出来,我表示衷心地感谢。