C # Сериализация класса с элементом данных List - PullRequest
1 голос
/ 30 марта 2011

У меня есть класс c #:

public class Test
{
    public Test() { }

    public IList<int> list = new List<int>();
}

Тогда у меня есть этот код:

        Test t = new Test();
        t.list.Add(1);
        t.list.Add(2);

        IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();
        StringWriter sw = new StringWriter();
        XmlSerializer xml = new XmlSerializer(t.GetType());
        xml.Serialize(sw, t);

Когда я смотрю на вывод SW, это:

<?xml version="1.0" encoding="utf-16"?>
<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />

значения 1,2, которые я добавил в переменную-член списка, не отображаются.

  1. Так как я могу это исправить? Я сделал список свойством, но оно все еще не работает.
  2. Я здесь использую сериализацию xml, есть ли другие сериализаторы?
  3. Я хочу производительность! Это лучший подход?

--------------- ОБНОВЛЕНИЕ НИЖЕ ------------------------ -

Итак, класс, который я хочу сериализовать, таков:

public class RoutingResult
    {
        public float lengthInMeters { get; set; }
        public float durationInSeconds { get; set; }

        public string Name { get; set; }

        public double travelTime
        {
            get
            {
                TimeSpan timeSpan = TimeSpan.FromSeconds(durationInSeconds);
                return timeSpan.TotalMinutes;
            }
        }

        public float totalWalkingDistance
        {
            get
            {
                float totalWalkingLengthInMeters = 0;
                foreach (RoutingLeg leg in Legs)
                {
                    if (leg.type == RoutingLeg.TransportType.Walk)
                    {
                        totalWalkingLengthInMeters += leg.lengthInMeters;
                    }
                }

                return (float)(totalWalkingLengthInMeters / 1000);
            }
        }

        public IList<RoutingLeg> Legs { get; set; } // this is a property! isnit it?
        public IList<int> test{get;set;} // test ...

        public RoutingResult()
        {
            Legs = new List<RoutingLeg>();
            test = new List<int>(); //test
            test.Add(1);
            test.Add(2);
            Name = new Random().Next().ToString(); // for test
        }
    }

Но XML, созданный сериализатором, таков:

<RoutingResult>
  <lengthInMeters>9800.118</lengthInMeters>
  <durationInSeconds>1440</durationInSeconds>
  <Name>630104750</Name>
</RoutingResult>

???

игнорирует оба этих списка?

Ответы [ 3 ]

4 голосов
/ 30 марта 2011

1) Ваш list - это поле, а не свойство, и XmlSerializer будет работать только со свойствами, попробуйте следующее:

public class Test
{    
    public Test() { IntList = new List<int>() }    
    public IList<int> IntList { get; set; }
}

2) Существуют и другие варианты сериализации, Двоичный основной другой, хотя есть и для JSON .

3) Двоичный код, вероятно, является наиболее эффективным способом, поскольку обычно это прямой дамп памяти, а выходной файл будет наименьшим.

1 голос
/ 31 марта 2011

Я понял, что XmlSerializer не работает, если я использую IList, поэтому я изменил его на List, что заставило его работать.Как также упоминал Нейт.

1 голос
/ 30 марта 2011

list не является собственностью.Измените это на публично видимое свойство, и это должно быть подобрано.

...