C # XML десериализация с пользовательским типом члена - PullRequest
2 голосов
/ 21 ноября 2011

У меня есть объект для десериализации, но объект имеет пользовательский тип 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>

Ответы [ 4 ]

2 голосов
/ 21 ноября 2011

вы можете изменить структуру вашего класса, как

[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; }
}

и затем установите свойство языка для сериализации

2 голосов
/ 21 ноября 2011

Уточнение: этот ответ основан на предварительном редактировании 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 используется в качестве прокси для короткогоформа LangXmlSerializer требуется, чтобы этот элемент был public, но я добавил несколько других атрибутов, чтобы он исчез из большинства других распространенных случаев использования.

0 голосов
/ 21 ноября 2011

Вы также можете реализовать IXmlSerializable интерфейс в вашем классе ApplicationLanguage

0 голосов
/ 21 ноября 2011

Вы можете вручную заполнить поле в коллекции выше, как это:

    [XmlAttribute("lang")]
    public string ManuallyFilledLang{ get; set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...