Почему сериализация double [] не работает в WinCE? - PullRequest
4 голосов
/ 23 февраля 2012

У меня есть объект, который (де) сериализует свою конфигурацию через system.xml.serializer

Конфиг в классе выглядит следующим образом:

    public struct Phase
    {
        public Int16 Trafo;
        public KorrekturWerte Spannung;
        public KorrekturWerte Strom;
        [XmlArray("Min")]
        public double[] Min;
        [XmlArray("Max")]
        public double[] Max;
        public bool CheckThis;
    }

    public class ParameterHardware
    {
        public string WAGOId = "00:30:DE:05:33:CB";
        public Byte Phasen = 0x07;
        public Phase L1;
        public Phase L2;
        public Phase L3;
    }

(De-) Сериализация этого в WindowsXP-System работает просто отлично, но в Windows CE, Min / Max-Array просто размышляет после де- и повторной инициализации («CheckThis» был помещен туда как тест и следует после сериализации значений "Strom"). Поскольку KorrekturWerte снова является структурой, глубина не может быть проблемой. [XmlArray ...] не было в моей первой версии, это просто из другого теста.

Edit:

  • Проблема не только в сериализации. Пытаясь получить доступ к Мин [...], я получаю нулевую ссылку.

  • Может быть, это не ясно: у меня есть сериализация класса, которая содержит все значения. Десериализовать его, чтобы инициализировать класс, а затем повторно выпустить его как проверку отладки. Теперь поля отсутствуют. (Оригинальный файл был сериализован в XP, где он работает нормально)

  • Изменение двойного [] на Список не помогает. (Тот же результат)

  • xml-файлы: Оригинал:

    00: 30: DE: 05: 53: 65 1 50 -0,2 1 0,004 0,994 0 0 0 0 0 500 32 15000 15000 1 правда 50 0 1 0 1 0 0 0 0 0 500 32 15000 15000 1 50 0 1 0 1 0 0 0 0 0 500 32 15000 15000 1

Пересериализация (извините, CE сериализуется в одну строку):

<?xml version="1.0" encoding="utf-8"?><ClassTest_FCT_Extern xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Hardware><WAGOId>00:30:DE:05:53:65</WAGOId><Phasen>1</Phasen><L1><Trafo>50</Trafo><Spannung><Offset>-0.2</Offset><Steigung>1</Steigung></Spannung><Strom><Offset>0.004</Offset><Steigung>0.994</Steigung></Strom><CheckThis>true</CheckThis></L1><L2><Trafo>50</Trafo><Spannung><Offset>0</Offset><Steigung>1</Steigung></Spannung><Strom><Offset>0</Offset><Steigung>1</Steigung></Strom><CheckThis>false</CheckThis></L2><L3><Trafo>50</Trafo><Spannung><Offset>0</Offset><Steigung>1</Steigung></Spannung><Strom><Offset>0</Offset><Steigung>1</Steigung></Strom><CheckThis>false</CheckThis></L3></ClassTest_FCT_Extern>
  • Извините, что приносил все по частям. Вот код сериализации (с использованием System.Xml.Serialization;)

    try
    {
        fstream = new FileStream(filepath, FileMode.Open, FileAccess.Read);
        reader = new XmlTextReader(fstream);
        serializer = new XmlSerializer(typeof(T));
        retobj = (T)serializer.Deserialize(reader);
    }
    catch (Exception e)
    {
        Debug("Serialization: "+e.ToString());
        retobj = Activator.CreateInstance<T>();
     }
    

Отладка не вызывается, поэтому, похоже, никаких ошибок нет.

  • Версия .net: 2.0

Ответы [ 2 ]

5 голосов
/ 23 февраля 2012

Ваш массив min / max должен быть инициализирован с new double[] или его нулем, и у вас есть исключения nullref и пропущенные поля.Нулевые значения не сериализуются и отсутствуют.

Edit2:

Похоже, существует проблема десериализации массивов / списков для вас.Пожалуйста, сделайте имена тегов элементов массива более понятными, например:

  [XmlArray("Min")]
  [XmlArrayItem("Value")]
  public double[] Min;
  [XmlArray("Max")]
  [XmlArrayItem("Value")]
  public double[] Max;

и попробуйте, если это вам поможет.

Edit3

то, что вы описали в нашем обсуждении и чате, вы, вероятно, столкнулись с реальной ошибкой в ​​.NET Compact Framework 2.0.

Поэтому, вероятно, вам лучше всего использовать пользовательский десериализатор под CE, если вы не можете обновить Framework.

В CE также сообщалось о некоторых других ошибках здесь .

3 голосов
/ 23 февраля 2012

В поисках других (работающих) решений я наконец-то обнаружил разницу между ними и моим подходом.У меня был публичный двойной [], а затем в некоторых тестах публичный список.У всех других решений был приватный список <>, а затем публичный получатель.(Этого достаточно для сериализации List <>).Изменив мою структуру фазы соответственно, теперь все работает нормально:

public class Phase
{
    public Int16 Trafo = 50;
    public KorrekturWerte Spannung = new KorrekturWerte() { Offset = 0, Steigung = 1 };
    public KorrekturWerte Strom = new KorrekturWerte() { Offset = 0, Steigung = 1 };
    private List<double> m_Min = new List<double>();
    private List<double> m_Max = new List<double>();
    public List<double> Min { get { return m_Min; } }
    public List<double> Max { get { return m_Max; } }
    //public double[] Default;
}
...