您好我刚开始使用C#WPF,我读到了序列化以存储或加载您的数据。我的问题是如何存储包含另一个类列表和一些其他参数的类?
我的第一堂课(MeterValues)包含许多参数(类型,速度等)。
public class MeterValues{}
我现在创建了第二个类来存储包含第一个类类型的多个实例的列表。 (所以如果我有3个不同的米,这个列表大小= 3)
public class MeterValuesList : IList<MeterValues>{}
现在我希望在第二个类中添加一个额外的参数,这个参数独立于第一个类,所以它只能保存一次。 (不适用于class1的每个实例)
为了清楚我的问题,我可以将额外的参数添加到第一个类,但是如果我有100个不同的米,则参数存储100次,我只需要存储一次。
有关如何做到这一点的任何想法?
PS:如果您需要任何其他信息,请问,我非常渴望学习并帮助您帮助我解决这个问题。提前谢谢。
更新:
我能够将MeterValuesList类保存到.xml文件中,但只有List存储在文件中,额外的参数没有出现(它在我写入文件之前就在类中,检查过它与调试器,但没有显示在文件中)
MeterValuesList meterValuesList = DataContext as MeterValuesList;
meterValuesList.CommSettings = "Com5:19200,8,n,1";
FileStream stream = null;
try
{
stream = new FileStream(filename, FileMode.Create, FileAccess.Write);
XmlSerializer serializer = new XmlSerializer(typeof(MeterValuesList));
serializer.Serialize(stream, meterValuesList);
stream.Close();
}
这是将类保存到xml文件后的结果。缺少额外的参数。
<?xml version="1.0"?>
<ArrayOfMeterValues xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<MeterValues></MeterValues>
</ArrayOfMeterValues>
答案 0 :(得分:2)
除非您计划覆盖或扩展IList所具有的功能,否则没有理由在MeterValuesList类中继承它。这感觉就像使用“有一个”关系而不是“是一种”关系。
请改为尝试:
public class MeterValuesGroup
{
List<MeterValues> MeterList { get; set; }
int ExtraParameter { get; set; }
// whatever additional parameters you need here.
}
如果你确实需要从IList或IEnumerable继承,你可以做类似的事情。但是,为了正确序列化此类,您必须在MeterValues和MeterValuesList中实现IXmlSerializable。
(以下是一个很好的示例:Proper way to implement IXmlSerializable?)
public class MeterValuesList : IList<MeterValues>, IXmlSerializable
{
MeterValues[] _MeterList { get; set; }
string CommSettings = "Com5:19200,8,n,1";
public void WriteXml(System.Xml.XmlWriter writer)
{
writer.WriteAttributeString("CommSettings ", CommSettings );
foreach (var mv in _MeterList)
{
// kind of a bad example, but hopefully you get the idea
if (mv== null)
return;
writer.WriteStartElement("MeterValues");
mv.WriteXml(writer);
writer.WriteEndElement();
}
}
答案 1 :(得分:0)
您可以在第二个类MeterValueList中添加此属性并序列化此类,并在反序列化时,将分配该附加属性。
MeterValueList m = new MeterValueList();
m.AdditionalParameter = 100;
MemoryStream memorystream = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(memorystream, m);
byte[] yourBytesToDb = memorystream.ToArray();
//here you write yourBytesToDb to database
//----------read from database---------------------
//here you read from database binary data into yourBytesFromDb
MemoryStream memorystreamd = new MemoryStream(yourBytesFromDb);
BinaryFormatter bfd = new BinaryFormatter();
MeterValueList md = bfd.Deserialize(memorystreamd) as MeterValueList ;
var i = md.AdditinalParameter; // must print 100