为什么序列化double []在WinCE中不起作用?

时间:2012-02-23 10:41:15

标签: c# .net xml-serialization windows-ce

我有一个Object with(de-)通过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系统上对此进行序列化可以正常工作,但在Windows CE上,最小/最大阵列只是在de-然后重新序列化后才会混淆(“CheckThis”作为测试放在那里并遵循序列化“Strom”值后)。 由于KorrekturWerte再次成为一个结构,深度不是问题。我的第一个版本中没有[XmlArray ...],只是来自另一个测试。

编辑:

  • 问题不是(仅)序列化。试图访问Min [...]我得到一个空引用错误。

  • 可能还不清楚:我有一个类的序列化,其中包含所有值。对其进行反序列化以初始化该类,然后将其重新序列化为调试检查。现在缺少这些字段。 (原始文件在XP中序列化,可以正常工作)

  • 将double []更改为List无济于事。 (结果相同)

  • 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            

Reserialization(抱歉,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>();
     }
    

未调用Debug,因此似乎没有任何错误。

  • .net版本为2.0

2 个答案:

答案 0 :(得分:5)

您的min / max数组必须使用new double[]或其null进行初始化,并且您具有nullref异常和缺少的字段。空值未序列化且缺失。

<强> EDIT2:

似乎有一个问题是为您反序列化数组/列表。请使数组项的标记名称更明确,如下所示:

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

并试试这对你有帮助。

<强> EDIT3

根据您在讨论和聊天中的描述,您必须遇到.NET Compact Framework 2.0中的真正错误。

如果您无法更新框架,那么最好的选择是在CE下使用custom Deserializer

在CE here下也报告了其他一些错误。

答案 1 :(得分:3)

寻找其他(工作)解决方案,我终于发现了它们和我的方法之间的区别。我有一个公共双[]或者在某些测试中有公共列表。所有其他解决方案都有一个私有列表&lt;&gt;然后是公众的吸气鬼。 (这足以使List&lt;&gt;序列化)。相应地改变我的结构阶段,现在一切正常:

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;
}