我想序列化一个类。在这个类中,有一个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”以上,如果是,则从字符串中提取每个值。
但这种方式看起来很笨拙,更像是一种解决方法。我想知道是否有更专业的方式呢?我的评论员非常特别,他不会接受这样的解决方案。如果您知道某种方式,请与我分享一下吗?非常感谢。
答案 0 :(得分:1)
有许多方法可以使用内置序列化。
最简单和最古老的是[Serializable]
属性,它告诉.NET序列化成员。
您还可以使用WCF [DataContract]
属性来序列化内容。
还有IXMLSerializable
接口,允许您为您的类实现自定义XML读取器和编写器。
最重要的是,没有必要自己动手 - 已经完成了。