带有自定义类型成员的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>

带有自定义类型成员的c# Xml反序列化

你可以像

那样改变你的类结构
[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接口