简体   繁体   中英

Error serializing XML - values empty

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM