如何使用.NET中的XML序列化序列化具有复杂属性的类?

时间:2010-10-15 07:48:50

标签: c# .net serialization xml-serialization

我想序列化一个类。在这个类中,有一个Class1类型的属性,它又有自己的属性。

public abstract class ComponentBase
{
    [ToSerialize] //An attribute defined my me, indicating whether or not to serialize this property.
    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>,例如

ComponentSettings[str_Name] = str_Value;

用于读取此值的方法是Reflection

// pinfo: Property Info got via Type.GetProperties();
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());

if(pinfo is ComponentArgs)
    componentSettings.Add(pinfo.Name, pinfo.GetValue(
        (ComponentArgs)this, null).WorkingPath+"\n"+
        LanguageList+"\n"+ //Language list is a concatinated string of all elements in the list.
        (ComponentArgs)this, null).ComponentOutputPath+"\n"+
    );

反序列化时,添加判断值是否包含2“\ n”以上,如果是,则从字符串中提取每个值。

但这种方式看起来很笨拙,更像是一种解决方法。我想知道是否有更专业的方式呢?我的评论员非常特别,他不会接受这样的解决方案。如果您知道某种方式,请与我分享一下吗?非常感谢。

1 个答案:

答案 0 :(得分:1)

有许多方法可以使用内置序列化。

最简单和最古老的是[Serializable]属性,它告诉.NET序列化成员。

您还可以使用WCF [DataContract]属性来序列化内容。

还有IXMLSerializable接口,允许您为您的类实现自定义XML读取器和编写器。

最重要的是,没有必要自己动手 - 已经完成了。