I have a nested C# object model that I have represented in XML. I want to be able to read this in from a file for my test harness to create test objects, however the de-serialisation returns an object with empty values, ie zeroes, nulls. No error is thrown.
This same block of code works for other object models and XML files I have, so it seems to be some way I am mapping the XML to my class structure.
Any thoughts?
Code
private static PosMenu LoadPosMenu(XmlNode node)
{
var deserializer = new XmlSerializer(typeof(PosMenu));
using (var reader = new StringReader(node.OuterXml))
{
var item = deserializer.Deserialize(reader) as PosMenu;
if (item == null) throw new InvalidDataException("Could not load Pos menu from Xml");
return item;
}
}
Object models
[DataContract]
public class PosMenu
{
[DataMember]
public int VenueId { get; set; }
[DataMember]
public int count { get; set; }
[DataMember]
public PosMenuEmbedded _embedded { get; set; }
}
[DataContract]
public class PosMenuEmbedded : IEntityComparable<PosMenuEmbedded>
{
[DataMember]
public long UniqueId { get; set; }
[DataMember]
public PosMenuCategory[] categories { get; set; }
[DataMember]
public int PosMenuId { get; set; }
}
[DataContract]
public class PosMenuCategory
{
[DataMember]
public long UniqueId { get; set; }
[DataMember]
public int VenueId { get; set; }
[DataMember]
public string Id { get; set; }
[DataMember]
public int PosMenuId { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public PosMenuItem[] Items { get; set; }
}
[DataContract]
public class PosMenuItem
{
[DataMember]
public long UniqueId { get; set; }
[DataMember]
public string Id { get; set; }
[DataMember]
public long PosMenuCategoryId { get; set; }
[DataMember]
public bool In_Stock { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public bool Open { get; set; }
[DataMember]
public string Pos_Id { get; set; }
[DataMember]
public double Price { get; set; }
[DataMember]
public PosPriceLevel[] Price_Levels { get; set; }
}
[DataContract]
public class PosPriceLevel
{
[DataMember]
public long UniqueId { get; set; }
[DataMember]
public string Id { get; set; }
[DataMember]
public double Price { get; set; }
}
XML
<PosMenu>
<Count>3</Count>
<Categories>
<PosMenuCategory>
<Id>AdiRjiAp</Id>
<Name>Drinks</Name>
<Items>
<PosMenuItem>
<Id>gki84ia9</Id>
<In_Stock>true</In_Stock>
<Name>Soda</Name>
<Open>false</Open>
<Pos_Id>gki84ia9</Pos_Id>
<Price>150</Price>
<Price_Levels>
<PosPriceLevel>
<Id>Byineidy</Id>
<Price>150</Price>
</PosPriceLevel>
<PosPriceLevel>
<Id>g4T4dTBj</Id>
<Price>200</Price>
</PosPriceLevel>
<PosPriceLevel>
<Id>K6czkc8b</Id>
<Price>250</Price>
</PosPriceLevel>
</Price_Levels>
</PosMenuItem>
<PosMenuItem>
<Id>doTaLTyg</Id>
<In_Stock>true</In_Stock>
<Name>Orange Juice</Name>
<Open>false</Open>
<Pos_Id>doTaLTyg</Pos_Id>
<Price>175</Price>
<Price_Levels>
<PosPriceLevel>
<Id>L4iqKid8</Id>
<Price>175</Price>
</PosPriceLevel>
<PosPriceLevel>
<Id>K6T8MTzb</Id>
<Price>300</Price>
</PosPriceLevel>
<PosPriceLevel>
<Id>K6czkc8b</Id>
<Price>250</Price>
</PosPriceLevel>
</Price_Levels>
</PosMenuItem>
</Items>
</PosMenuCategory>
<PosMenuCategory>
<Id>AkT69Tgy</Id>
<Name>Appetizers</Name>
<Items>
<PosMenuItem>
<Id>GyiKLiLo</Id>
<In_Stock>false</In_Stock>
<Name>Chips and Salsa</Name>
<Open>false</Open>
<Pos_Id>GyiKLiLo</Pos_Id>
<Price>250</Price>
<Price_Levels>
<PosPriceLevel>
<Id>neiani8B</Id>
<Price>250</Price>
</PosPriceLevel>
</Price_Levels>
</PosMenuItem>
<PosMenuItem>
<Id>recb5cKX</Id>
<In_Stock>true</In_Stock>
<Name>Mozzarella Sticks</Name>
<Open>false</Open>
<Pos_Id>recb5cKX</Pos_Id>
<Price>425</Price>
<Price_Levels>
<PosPriceLevel>
<Id>Bycnrcdy</Id>
<Price>425</Price>
</PosPriceLevel>
</Price_Levels>
</PosMenuItem>
</Items>
</PosMenuCategory>
<PosMenuCategory>
<Id>rXcXyc7b</Id>
<Name>Burgers</Name>
<Items>
<PosMenuItem>
<Id>rMTAbTjr</Id>
<In_Stock>false</In_Stock>
<Name>New Bacon-ings</Name>
<Open>false</Open>
<Pos_Id>rMTAbTjr</Pos_Id>
<Price>689</Price>
<Price_Levels>
<PosPriceLevel>
<Id>7oTd8T9A</Id>
<Price>689</Price>
</PosPriceLevel>
</Price_Levels>
</PosMenuItem>
<PosMenuItem>
<Id>gkc8bca9</Id>
<In_Stock>false</In_Stock>
<Name>Poblana Picasso Burger</Name>
<Open>false</Open>
<Pos_Id>gkc8bca9</Pos_Id>
<Price>799</Price>
<Price_Levels>
<PosPriceLevel>
<Id>K6czEc8b</Id>
<Price>799</Price>
</PosPriceLevel>
</Price_Levels>
</PosMenuItem>
<PosMenuItem>
<Id>gdijnib8</Id>
<In_Stock>false</In_Stock>
<Name>Tunami</Name>
<Open>false</Open>
<Pos_Id>gdijnib8</Pos_Id>
<Price>799</Price>
<Price_Levels>
<PosPriceLevel>
<Id>L8ijGiGX</Id>
<Price>799</Price>
</PosPriceLevel>
</Price_Levels>
</PosMenuItem>
</Items>
</PosMenuCategory>
</Categories>
</PosMenu>
Rename properties to make it similar to xml elements names (and also rename "_embeded" element in xml to "Embeded"):
[DataContract]
public class PosMenu
{
[DataMember]
public int VenueId { get; set; }
[DataMember]
public int Count { get; set; }
[DataMember]
public PosMenuEmbedded Embeded { get; set; }
}
[DataContract]
public class PosMenuEmbedded
{
[DataMember]
public long UniqueId { get; set; }
[DataMember]
public PosMenuCategory[] Categories { get; set; }
[DataMember]
public int PosMenuId { get; set; }
}
As an alternative solution you can add the attribute to properties. For example:
[XmlElement(ElementName = "Count")]
public int count { get; set; }
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.