带有自定义类型成员的c# Xml反序列化
本文关键字:Xml 反序列化 成员 自定义 类型 | 更新日期: 2023-09-27 18:15:20
我有一个对象要反序列化,但是该对象具有不能序列化的自定义类型ApplicationLanguage
。
[Serializable]
public class FieldTranslation
{
// how is this possible?
// does the 'en-us' in this member is reachable in this concept?
//public ApplicationLanguage Lang = ApplicationLanguagesList.Get("en-us");
//public ApplicationLanguage Lang { get; set; }
[XmlAttribute("name")]
public string Name{ get; set; }
public string Tooltip { get; set; }
public string Label { get; set; }
public string Error { get; set; }
public string Language { get; set; }
}
我构建了一个API来从缓存中获取类型ApplicationLanguage
,如下所示:
ApplicationLanguage en= ApplicationLanguagesList.Get("en-us");
我是否可以在上面的序列化中组合自定义类型?
这是xml:
<Fields lang="en-us">
<Item name="FirstName">
<Tooltip>Please provide your {0}</Tooltip>
<Error>{0} Is not valid</Error>
<Label>First Name</Label>
</Item>
</Fields>
你可以像
那样改变你的类结构[Serializable]
[XmlRoot("Fields")]
public class FieldCollection
{
[XmlAttribute("lang")]
public string Lanuage { get; set; }
[XmlElement("Item")]
public FieldTranslation[] Fields { get; set; }
}
[Serializable]
public class FieldTranslation
{
[XmlAttribute("name")]
public string Name { get; set; }
public string Tooltip { get; set; }
public string Label { get; set; }
public string Error { get; set; }
public string Language { get; set; }
}
,然后将language属性设置为序列化
澄清:这个答案是基于预先编辑的xml,那里有一个
<Language>he</Language>
元素。不适用于<Fields lang="en-us">
场景。
类似:
[XmlIgnore]
public ApplicationLanguage Lang { get; set; }
[XmlElement("Language")]
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public string LangSerialized {
get { return Lang == null ? null : Lang.Name; } // or where-ever "he" comes from
set { Lang = value == null ? null : ApplicationLanguagesList.GetByName(value); }
}
这里LangSerialized
成员用作Lang
的简写形式的代理。对于XmlSerializer
,要求该成员是public
,但我添加了一些其他属性,使其从大多数其他常见用法中消失。
您可以像这样手动填写上面集合中的字段:
[XmlAttribute("lang")]
public string ManuallyFilledLang{ get; set; }
您还可以在ApplicationLanguage类中实现IXmlSerializable
接口