<FileTransferSettings>
<UploadPath src="user">C:\uploads</UploadPath>
<DownloadPath src="app">C:\downloads</DownloadPath>
</FileTransferSettings>
我想将此XML反序列化为具有2个属性的FileTransferSettings对象 - UploadPath和DownloadPath。但是我也希望以我的代码可以查询它的方式保留每个属性的src
属性。
我认为创建一个关联的UploadPathSrc和DownloadPathSrc属性有点笨拙和麻烦。
还有另一种方法可以在.NET中表示这一点吗?对我来说,src
属性似乎应该被视为元数据。这是最好的做法吗?
(背景为为什么我正在尝试这样做 - 请参阅我的previous question)。
感谢。
答案 0 :(得分:4)
为了正确地序列化和反序列化XML,您需要使用XML序列化属性来修饰类
[XmlRoot("FileTransferSettings")]
public class FileTransferSettings
{
[XmlElement("DownloadPath")]
public DownloadPath DownloadPath { get; set; }
// ...
}
[XmlType("DownloadPath")]
public class DownloadPath
{
[XmlAttribute]
public string Src; // or use enum etc
[XmlText]
public string Text;
}
// the serialized XML looks like
<FileTransferSettings>
<DownloadPath Src="...">text</DownloadPath>
....
</FileTransferSettings>
答案 1 :(得分:3)
您可以创建第二个类FileTransferPath,其字符串值为“Path”,枚举值为“Source”
class FileTransferSettings
{
public FileTransferPath UploadPath { get; set; }
public FileTransferPath DownloadPath { get; set; }
// ...
}
class FileTransferPath
{
public string Path { get; set; }
public FileTransferSource Source { get; set}
public enum FileTransferSource
{
None,
User,
Application,
// ...
}
}
然后你可以使用像
这样的代码 obj.UploadPath.Path;
obj.UploadPath.Source;
您可以为类属性选择更好的名称;我不知道我喜欢Path的重复。 obj.Upload.Path
或其他东西可能会更好。
请注意,您无法直接对使用XmlSerialization的格式直接序列化/反序列化;但它确实完成了你所需要的。 (你仍然可以序列化为XML,你只需要做更多的工作)
答案 2 :(得分:3)
扩展Daniel L.的总体思路。
public Class FileTransferPath
{
public Enum SourceEnum { User, App }
public SourceEnum Source { get; set; } //Automatic properties in 3.5 Syntax
public string FilePath { get; set; }
}
public Class FileTransferSettings
{
public FileTransferPath UploadPath { get; set; }
public FileTransferPath DownLoadPath { get; set; }
}