为什么串行化double[]在WinCE中不起作用

本文关键字:WinCE 不起作用 double 为什么 | 更新日期: 2023-09-27 18:25:28

我有一个对象,它通过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;
    }

(去)在WindowsXP系统上串行化可以很好地工作,但在Windows CE上,最小/最大数组只是在去和保留后混乱("CheckThis"是作为测试放在那里的,在串行化"Strom"值后紧随其后)。由于KorrekturWelte又是一个结构体,深度不会成为问题。[XmlArray…]在我的第一个版本中不存在,它只是来自另一个测试。

编辑:

  • 问题并非(仅)在序列化中。尝试访问Min[…]时出现空引用错误。

  • 也许还不清楚:我有一个类的序列化,其中包含所有值。将其反序列化以初始化类,然后将其保留为调试检查。现在字段不见了。(原始文件是在XP中序列化的,在那里它可以正常工作)

  • 将双精度[]更改为List没有帮助。(相同结果)

  • xml文件:原件:

    00:30:时间:05:53:651.50-0.21.0.0040.994000005003215000150001.真的5001.01.000005003215000150001.5001.01.000005003215000150001.

重新序列化(抱歉,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

为什么串行化double[]在WinCE中不起作用

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

第2版:

似乎在为您反序列化数组/列表时出现了问题。请使数组项的标签名称更加明确,如下所示:

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

如果这对你有帮助的话,试试看。

第3版

根据您在我们的讨论和聊天中描述的内容,您一定在.NET Compact Framework 2.0中遇到了一个真正的错误。

因此,如果你不能更新框架,最好的选择是在CE下使用自定义的反序列化程序。

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

在搜索其他(有效的)解决方案时,我终于发现了它们与我的方法之间的区别。我有一个公开的替身[],或者在一些测试中有一个公共列表。所有其他解决方案都有一个私有列表<>然后成为公众的积极分子。(这对于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;
}