1

こんにちは私はC#WPFを使い始めたばかりで、データを保存またはロードするためのシリアル化について読みました。私の質問は、別のクラスのリストといくつかの追加のパラメーターを含むクラスをどのように保存できるかということです。

私の最初のクラス(MeterValues)には、いくつかのパラメーター(type、speedなど)が含まれています。

public class MeterValues{}

ここで、最初のクラスタイプの複数のインスタンスを含むリストを格納するために2番目のクラスを作成しました。(つまり、3つの異なるメーターがある場合、このリストサイズ= 3)

public class MeterValuesList : IList<MeterValues>{}

次に、2番目のクラスにパラメーターを追加します。これは、最初のクラスから独立しているため、一度だけ保存する必要があります。(class1のすべてのインスタンスに対してではありません)

問題を明確にするために、最初のクラスにパラメーターを追加することもできますが、100の異なるメーターがある場合、パラメーターは100回保存され、1回だけ保存する必要があります。

これを行う方法について何かアイデアはありますか?

PS:追加情報が必要な場合は、お問い合わせください。この問題の解決を支援するために、私は非常に熱心に学び、支援したいと思っています。前もって感謝します。

アップデート:

クラスMeterValuesListを.xmlファイルに保存することはできますが、リストのみがファイルに保存され、追加のパラメーターは表示されません(ファイルに書き込む直前のクラスにあり、デバッガーで確認しました)ただし、ファイルには表示されません)

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>
4

2 に答える 2

2

IListの機能をオーバーライドまたは拡張する予定がない限り、MeterValuesListクラスでIListから継承する理由はありません。これは、「isa」関係の代わりに「hasa」関係を使用する場合のように感じます。

代わりにこれを試してください:

public class MeterValuesGroup
{
    List<MeterValues> MeterList { get; set; }
    int ExtraParameter { get; set; }
    // whatever additional parameters you need here.
}

IListまたはIEnumerableから継承する必要がある場合は、同様のことを行うことができます。ただし、このクラスを正しくシリアル化するには、MeterValuesおよびMeterValuesListにIXmlSerializableを実装する必要があります。

(これがどのように見えるかの優れた例です: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();
        }
    }
于 2013-03-19T15:22:45.080 に答える
0

このプロパティを2番目のクラス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
于 2013-03-19T15:15:51.703 に答える