我有一个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,因此似乎没有任何错误。
答案 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;
}