views:

159

answers:

2

I am creating serialized XML for a LINQ to SQL project using the DataContractSerializer class. Upon serialization and inspecting the returned object, I get XML that looks like this.

- <ContentObject xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/MyProject.Data.Model"&gt;
  <_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.

I am trying to find out how to simplify the XML structure to just be

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

I have tried decorating the wrapper object

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

but this doesn't help. Can anyone help me find what exactly I need to do to specify the XML structure, either within the class or in the DBML Designer file? Any link or article would be very helpful too. Thanks!

A: 

I found my own answer : I was mixing technology : I needed to change the class decorations as follows:

[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.
Ash Machine
You beat me to my answer by seconds :-)
marc_s
+1  A: 

If you are using the DataContractSerializer as you mentioned, then you have to decorate your structure with [DataContract] and [DataMember] attributes - not [Serializable] and [XmlAttribute] and so forth (those are used for regular and XML serializers).

The DataContractSerializer is a strictly "opt-in" serializer - only those fields and/or properties that you specifically mark with [DataMember] will end up being serialized; as opposed to the XmlSerializer which is opt-out - it serializes everything unless it's marked with [XmlIgnore].

Marc

marc_s