如何在c#wpf中结合其他变量保存类列表

如何在c#wpf中结合其他变量保存类列表,c#,wpf,serialization,C#,Wpf,Serialization,嗨,我刚开始使用C#WPF,我读到了有关存储或加载数据的序列化的内容。我的问题是如何存储包含另一个类和一些附加参数的列表的类 我的第一个类(MeterValue)包含许多参数(类型、速度等) public类MeterValues{} 我现在创建了第二个类来存储包含第一个类类型的多个实例的列表。(如果我有3个不同的米,这个列表大小=3) 公共类MeterValuesList:IList{} 现在,我希望为第二个类添加一个额外的参数,它独立于第一个类,因此应该只保存一次。(并非针对类别1的所有实例)

嗨,我刚开始使用C#WPF,我读到了有关存储或加载数据的序列化的内容。我的问题是如何存储包含另一个类和一些附加参数的列表的类

我的第一个类(MeterValue)包含许多参数(类型、速度等)

public类MeterValues{}

我现在创建了第二个类来存储包含第一个类类型的多个实例的列表。(如果我有3个不同的米,这个列表大小=3)

公共类MeterValuesList:IList{}

现在,我希望为第二个类添加一个额外的参数,它独立于第一个类,因此应该只保存一次。(并非针对类别1的所有实例)

为了澄清我的问题,我可以将额外的参数添加到第一个类中,但是如果我有100个不同的米,那么该参数将被存储100次,我只需要存储一次

你知道怎么做吗

PS:如果您需要任何其他信息,请直接询问,我非常渴望学习并帮助您帮助我解决这个问题。提前谢谢

更新:

我能够将类MeterValuesList保存到一个.xml文件中,但只有列表存储在该文件中,额外的参数不会显示(在我将其写入文件之前,它就在类中,使用调试器检查了它,但不会显示在该文件中)

这是将类保存到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>

您可以将该属性添加到第二个类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

除非您计划重写或扩展IList现有的功能,否则没有理由在MeterValuesList类中继承它。这感觉就像是使用“hasarelationship”而不是“is-a”关系

请尝试以下方法:

public class MeterValuesGroup
{
    List<MeterValues> MeterList { get; set; }
    int ExtraParameter { get; set; }
    // whatever additional parameters you need here.
}
公共类MeterValuesGroup
{
列表MeterList{get;set;}
int外部参数{get;set;}
//这里需要的任何其他参数。
}
如果确实需要从IList或IEnumerable继承,则可以执行类似的操作。但是,为了正确序列化此类,必须在MeterValues和MeterValuesList中实现IXmlSerializable

(这是一个很好的例子,说明了这一点:)

公共类MeterValuesList:IList,IXmlSerializable
{
MeterValue[]_MeterList{get;set;}
字符串CommSettings=“Com5:19200,8,n,1”;
public void WriteXml(System.Xml.XmlWriter)
{
WriteAttributeString(“CommSettings”,CommSettings);
foreach(仪表列表中的var mv)
{
//这算是个坏例子,但希望你能理解
如果(mv==null)
返回;
WriteStarteElement(“MeterValue”);
mv.WriteXml(writer);
writer.writeedelement();
}
}

必须承认,PS是令人惊奇的。但你可能想把它改写成“帮我解决问题”而不是“帮助我学习”。MeterValuesList需要从IList派生有什么特殊的原因吗?你不能创建一个包含List属性的新类吗?也许他想遍历它,这样他就可以像你建议的那样实现它并实现IEnumerable(示例:)@Dzyann这是一个很好的观点。我希望OP回来澄清这一点。您好,感谢您的回复,我的同事告诉我它必须是IList,因为他实现了一些使用IEnumerator的函数。我想这就是Dzyann的意思。我为您更新了我的答案。我想您还需要从两种MeterVal中的IXmlSerializable继承ues和MeterValuesList。否则序列化程序将无法识别您的其他字段。您好,感谢您的响应,我的类必须保存到我调用对话框后选择的文件中。我是WPF c#的新手,我不确定如何调整您的代码以将其保存到文件中。因此,我不确定如何测试此代码。
public class MeterValuesGroup
{
    List<MeterValues> MeterList { get; set; }
    int ExtraParameter { get; set; }
    // whatever additional parameters you need here.
}
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();
        }
    }