XML сериализация c # - PullRequest
       2

XML сериализация c #

4 голосов
/ 10 ноября 2010

Не могу понять, что я делаю неправильно, набор результатов пуст.
Мой код:

class Class1
    {

        public static object DeSerialize()
        {
            object resultObject;

            XmlSerializer serializer = new XmlSerializer(typeof(PointsContainer));
           using (TextReader textReader = new StreamReader(@"d:\point.xml"))
            {
                resultObject = serializer.Deserialize(textReader);
            }

            return resultObject;


        }
    }

    [Serializable]
    [XmlRoot("Points")]
    public class PointsContainer
    {
        [XmlElement("Point")]       
        private List<Point> items = new List<Point>();

        public List<Point> Items
        {
            get { return items; }
            set { items = value; }
        }


    }


    [Serializable]   
    public class Point
    {      
        [XmlAttribute]
        public bool x { get; set; }

        [XmlAttribute]
        public bool y { get; set; }
    }

Xml:

<Points>  
   <Point x="1" y="5"/>
   <Point x="21" y="3"/>
   <Point x="3" y="7"/>
</Points>

Ответы [ 6 ]

8 голосов
/ 10 ноября 2010

Переместить атрибут [XmlElement] в свойство.
XmlSerializer игнорирует приватных участников.

1 голос
/ 10 ноября 2010

Решение:

namespace XmlStackProblem
{
    class Class1
    {

        public static void Main()
        {
            Points resultObject;

            XmlSerializer serializer = new XmlSerializer(typeof(Points));
            using (TextReader textReader = new StreamReader(@"d:\points.xml"))
            {
                resultObject = serializer.Deserialize(textReader) as Points;
            }
        }
    }

    [Serializable]
    [XmlRoot(IsNullable = false)]
    public class Points
    {
        [XmlElementAttribute("Point")]
        public List<Point> Point
        {
            get; set;
        }
    }

    [Serializable]
    [XmlType(AnonymousType = true)]
    public class Point
    {
        [XmlAttribute]
        public int x
        {
            get;
            set;
        }

        [XmlAttribute]
        public int y { get; set; }
    }
}
1 голос
/ 10 ноября 2010
[XmlElement("Point")]
public List<Point> Items
{
  get { return items; }
  set { items = value; }
}

А в вашем классе точек и x, и y не должны быть bools.

1 голос
/ 10 ноября 2010

переменные bool могут иметь значение true или false, которые имеют целочисленные значения 1 и 0. Таким образом, ваш XML содержит недопустимые данные и / или свойства вашего класса имеют неправильный тип.

1 голос
/ 10 ноября 2010

как говорит SLaks

также ваш объект Point отображает оба поля в виде bools, но значения в файле xml по крайней мере целые числа (21, 3,5,7 и т. Д.)

0 голосов
/ 01 августа 2013

Вы можете использовать функцию DeSerialize, которая возвращает тип объекта, как в этом примере:

public T DeSerializeFromString<T>(string data)
        {
            T result;
            StringReader rdr = null;
            try
            {
                rdr = new StringReader(data);
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
                result = (T)xmlSerializer.Deserialize(rdr);
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                rdr.Close();
            }
            return result;
        }
...