序列化自定义集合时遇到问题
Trouble Serializing a Custom Collection
我有一个 DataGrid,它包含我正在处理的机器人的配置参数。我正在尝试将功能添加到 import/export 组参数,并且我正在尝试使用 XML 序列化来实现。
我是 XML 序列化的新手,对 C# 还是很陌生,所以我不知道我哪里出错了。
我制作了一个 class,如下所示,用于保存数据网格中的值。我无法使用填充数据网格的相同类型,因为 class 中有太多断开连接的逻辑和垃圾,以至于序列化永远无法工作。
[Serializable]
public class CmcdSerializationBuffer
{
[XmlElement]
public string Name { get; set; }
[XmlElement]
public string TypeAssemblyQualifiedName { get; set; }
private string _storedValue;
[XmlElement]
public string StoredValue
{
get { return _storedValue; }
set { _storedValue = value; }
}
private string _temporaryValueFromUser;
public string TemporaryValueFromUser
{
get { return _temporaryValueFromUser; }
set { _temporaryValueFromUser = value; }
}
[XmlElement]
public string DefaultValue { get; set; }
public CmcdSerializationBuffer()
{
}
public CmcdSerializationBuffer(CmcdConfigurationParameter parameter)
{
Name = parameter.Name;
TypeAssemblyQualifiedName = parameter.TypeAssemblyQualifiedName;
StoredValue = parameter.StoredValue;
TemporaryValueFromUser = parameter.TemporaryValueFromUser;
DefaultValue = parameter.DefaultValue;
}
}
所以我做了这个 class 来绕过它,它只接受 CmcdConfigurationParameter
(填充 DataGrid 的类型)并复制值。
顺便说一句,这可以正确序列化。
我想将其中的多个导出到一个文件中,所以我想我会制作一个包含 CmcdSerializatinonBuffer
个对象的自定义集合 class。这是我所拥有的:
[Serializable]
public class ValuesToExport
{
[XmlArray("ParamsList")]
public List<CmcdSerializationBuffer> Parameters { get; set; }
public ValuesToExport()
{
Parameters = new List<CmcdSerializationBuffer>();
}
public ValuesToExport(List<CmcdSerializationBuffer> parameters)
{
Parameters = new List<CmcdSerializationBuffer>();
Parameters = parameters;
}
}
这是我用来导出值的函数:
public void Export()
{
ValuesToExport val = new ValuesToExport();
CmcdSerializationBuffer tempBuffer = new CmcdSerializationBuffer();
foreach (CmcdConfigurationParameter param in MasterDataGrid.ItemsSource)
{
tempBuffer = new CmcdSerializationBuffer(param);
val.Parameters.Add(tempBuffer);
Console.WriteLine(val.Parameters.Count());
}
MessageBox.Show(MasterDataGrid.ItemsSource.GetType().ToString());
//ValuesToExport val = new ValuesToExport(MasterDataGrid.ItemsSource);
XmlSerializer serialiser = new XmlSerializer(typeof(ValuesToExport));
using (FileStream fs = new FileStream("D:\test\testserialization.txt", FileMode.OpenOrCreate))
using (TextWriter writer = new StreamWriter(fs))
{
serialiser.Serialize(writer, val.Parameters);
Console.WriteLine(val.Parameters);
writer.Close();
}
}
我不知道这样做是否正确,但它适用于单个参数。但是,当我尝试序列化我的 ValuesToExport
class 时,我收到一条错误消息:
"Unable to cast object of type 'System.Collections.Generic.List`1[Hamilton.HST.MotionController.DeviceConfiguration.CmcdSerializationBuffer]' to type 'Hamilton.HST.MotionController.DeviceUI.ValuesToExport'."
我没能解决这个问题。如果有人知道我该如何解决这个问题,我很想知道。谢谢!
您收到此错误是因为您为类型 ValuesToExport
创建了一个 XmlSerializer
,但是当您调用 .Serialize
方法时,您向它传递了一个列表 CmcdSerializationBuffer
。这不是序列化程序所期望的类型,因此会抛出错误。
要修复它,您可以更改此行:
serialiser.Serialize(writer, val.Parameters);
对此:
serialiser.Serialize(writer, val);
我有一个 DataGrid,它包含我正在处理的机器人的配置参数。我正在尝试将功能添加到 import/export 组参数,并且我正在尝试使用 XML 序列化来实现。
我是 XML 序列化的新手,对 C# 还是很陌生,所以我不知道我哪里出错了。
我制作了一个 class,如下所示,用于保存数据网格中的值。我无法使用填充数据网格的相同类型,因为 class 中有太多断开连接的逻辑和垃圾,以至于序列化永远无法工作。
[Serializable]
public class CmcdSerializationBuffer
{
[XmlElement]
public string Name { get; set; }
[XmlElement]
public string TypeAssemblyQualifiedName { get; set; }
private string _storedValue;
[XmlElement]
public string StoredValue
{
get { return _storedValue; }
set { _storedValue = value; }
}
private string _temporaryValueFromUser;
public string TemporaryValueFromUser
{
get { return _temporaryValueFromUser; }
set { _temporaryValueFromUser = value; }
}
[XmlElement]
public string DefaultValue { get; set; }
public CmcdSerializationBuffer()
{
}
public CmcdSerializationBuffer(CmcdConfigurationParameter parameter)
{
Name = parameter.Name;
TypeAssemblyQualifiedName = parameter.TypeAssemblyQualifiedName;
StoredValue = parameter.StoredValue;
TemporaryValueFromUser = parameter.TemporaryValueFromUser;
DefaultValue = parameter.DefaultValue;
}
}
所以我做了这个 class 来绕过它,它只接受 CmcdConfigurationParameter
(填充 DataGrid 的类型)并复制值。
顺便说一句,这可以正确序列化。
我想将其中的多个导出到一个文件中,所以我想我会制作一个包含 CmcdSerializatinonBuffer
个对象的自定义集合 class。这是我所拥有的:
[Serializable]
public class ValuesToExport
{
[XmlArray("ParamsList")]
public List<CmcdSerializationBuffer> Parameters { get; set; }
public ValuesToExport()
{
Parameters = new List<CmcdSerializationBuffer>();
}
public ValuesToExport(List<CmcdSerializationBuffer> parameters)
{
Parameters = new List<CmcdSerializationBuffer>();
Parameters = parameters;
}
}
这是我用来导出值的函数:
public void Export()
{
ValuesToExport val = new ValuesToExport();
CmcdSerializationBuffer tempBuffer = new CmcdSerializationBuffer();
foreach (CmcdConfigurationParameter param in MasterDataGrid.ItemsSource)
{
tempBuffer = new CmcdSerializationBuffer(param);
val.Parameters.Add(tempBuffer);
Console.WriteLine(val.Parameters.Count());
}
MessageBox.Show(MasterDataGrid.ItemsSource.GetType().ToString());
//ValuesToExport val = new ValuesToExport(MasterDataGrid.ItemsSource);
XmlSerializer serialiser = new XmlSerializer(typeof(ValuesToExport));
using (FileStream fs = new FileStream("D:\test\testserialization.txt", FileMode.OpenOrCreate))
using (TextWriter writer = new StreamWriter(fs))
{
serialiser.Serialize(writer, val.Parameters);
Console.WriteLine(val.Parameters);
writer.Close();
}
}
我不知道这样做是否正确,但它适用于单个参数。但是,当我尝试序列化我的 ValuesToExport
class 时,我收到一条错误消息:
"Unable to cast object of type 'System.Collections.Generic.List`1[Hamilton.HST.MotionController.DeviceConfiguration.CmcdSerializationBuffer]' to type 'Hamilton.HST.MotionController.DeviceUI.ValuesToExport'."
我没能解决这个问题。如果有人知道我该如何解决这个问题,我很想知道。谢谢!
您收到此错误是因为您为类型 ValuesToExport
创建了一个 XmlSerializer
,但是当您调用 .Serialize
方法时,您向它传递了一个列表 CmcdSerializationBuffer
。这不是序列化程序所期望的类型,因此会抛出错误。
要修复它,您可以更改此行:
serialiser.Serialize(writer, val.Parameters);
对此:
serialiser.Serialize(writer, val);