Указание структуры сериализованного XML с использованием DataContractSerializer - PullRequest
0 голосов
/ 08 мая 2009

Я создаю сериализованный XML для проекта LINQ to SQL с использованием класса DataContractSerializer. После сериализации и проверки возвращенного объекта я получаю XML, который выглядит следующим образом.

- <ContentObject xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/MyProject.Data.Model">
  <_x003C_ID_x003E_k__BackingField>1</_x003C_ID_x003E_k__BackingField> 
  <_x003C_ObjectItemState_x003E_k__BackingField>Active</_x003C_ObjectItemState_x003E_k__BackingField> 
  <_x003C_ObjectName_x003E_k__BackingField>6ec555b0ba244ab4a8b2d2f2e7f4185a</_x003C_ObjectName_x003E_k__BackingField>   ETC. 

Я пытаюсь выяснить, как упростить структуру XML до

- <ContentObject xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/MyProject.Data.Model">
  <ID>1</ID> 
  <ObjectItemState>Active</ObjectItemStat> 
  <ObjectName>6ec555b0ba244ab4a8b2d2f2e7f4185a</ObjectName>    ETC

Я попытался украсить объект-оболочку

 namespace MyProject.Data.Model
{
    [Serializable]
    public class ContentObject
    {
        [XmlAttribute("ID")]
        public int ID { get; set; }
        [XmlAttribute("ObjectName")]
        public string ObjectName { get; set; }      
        [XmlAttribute("ObjectItemState")]
        public string ObjectItemState { get; set; }  ETC
    }
}

но это не помогает. Может ли кто-нибудь помочь мне найти, что именно мне нужно сделать, чтобы указать структуру XML, либо внутри класса, либо в файле конструктора DBML? Любая ссылка или статья тоже будет очень полезна. Спасибо!

Ответы [ 2 ]

2 голосов
/ 08 мая 2009

Если вы используете DataContractSerializer, как вы упомянули, вы должны украсить свою структуру атрибутами [DataContract] и [DataMember] - не [Serializable] и [XmlAttribute] и т. Д. (Они используются для обычных XML-сериализаторы).

DataContractSerializer является строго «включенным» сериализатором - только те поля и / или свойства, которые вы специально отметили [DataMember], в конечном итоге будут сериализованы; в отличие от отказавшегося XmlSerializer - он сериализует все, если не помечен [XmlIgnore].

Марк

0 голосов
/ 08 мая 2009

Я нашел свой собственный ответ: я смешивал технологии: мне нужно было изменить декорации класса следующим образом:

[Serializable]
/// <summary>
/// regular Object type, like Client or Poll
/// </summary>
[DataContract(Name = "ContentObject", Namespace = "http://www.myproject.dev")]
public class ContentObject
{
    [DataMember(Name = "ID")]
    public int ID { get; set; }
    [DataMember(Name = "ObjectName")]
    public string ObjectName { get; set; }
    [DataMember(Name = "ObjectItemState")]
    public ItemState ObjectItemState { get; set; } ETC.
...