0

s とs のModelリストを含むクラスがあります。MessageSignal

EveryMessageには 0、1、またはそれ以上のシグナルを含めることができます。ASignalは同時に 0、1、またはそれ以上のメッセージに含めることができます。XmlSerializer で逆シリアル化するときにメッセージとシグナルの関係を維持するのに問題がありますが、オブジェクトの重複も避けます (私のアプリケーションでは XmlSerializer 以外のものを使用することはできません)。

class Model
{
    private MessageCollection messages;
    public MessageCollection Messages { get { return messages; } }

    private SignalCollection signals;
    public SignalCollection Signals { get { return signals; } }

    public Model()
    {
        // the collection classes automatically set the Model property of any
        // Messages/Signals added to its appropriate owner (this)
        this.messages = new MessageCollection(this);
        this.signals = new SignalCollection(this);
    }
}

class Message
{
    [XmlIgnore] // set by MessageCollection
    public Model Model { get; set; }

    public List<Signal> Signals
    {
        get { ??? }
    }
}

class Signal
{
    [XmlIgnore] // set by SignalCollection
    public Model Model { get; set; }

    public List<Message> Messages
    {
        get { return this.Model.Messages.Where(x => x.Signals.Contains(this)).ToList(); }
    }
}

リストにあるように、シグナルのインデックスを含むクラスにaList<uint> SignalIndicesを格納するという考えがありました。ただし、シリアル化/逆シリアル化するときに XmlSerializer がインデックスを台無しにしないと想定しても安全ですか? また、このアプローチは、属性を取得し、リストを使用して別の Linq に依存して、 と同様のことを達成することを意味します。MessageModel.SignalsMessage.Signals[XmlIgnore]SignalIndicesSignal.Messages

つまり、MessageCollection および SignalCollection クラスで使用されるのと同様の手法を使用して、常にデータの一貫性を確保することは可能ですか (オブジェクト構築の順序が定義されていない逆シリアル化プロセス中も)。 " List<Signal>Linq を使用しない Message クラスのシグナル ( ) のリスト?

4

2 に答える 2

1

signalcollection 内のモデルへの参照が純粋にモデル プロパティを設定するためのものである場合は、メッセージ自体の中で signalcollection クラスを使用できます。

class Message
{
    [XmlIgnore] // set by MessageCollection
    public Model Model { get{return signals==null ? null : signals.Model;} set{signals=new SignalCollection(value);} }

    SignalCollection signals;
    public SignalCollection Signals
    {
        get { return signals; }
    }
}

または、モデル プロパティを公開する List から新しいシグナル クラスを派生させます。

上記がオプションでない場合は、逆シリアル化後に起動するメソッドを Model に追加できます ( OnDeserializedAttributeを使用)

class Model
{
     [OnDeserialized]
     private void restoreModelSignals(StreamingContext context)
    {
        //bit of linq here though
        foreach(var s in messages.SelectMany(m=>m.Signals))
             s.Model=this;
    }
}
于 2012-07-04T10:33:49.927 に答える
1

メッセージとシグナルの両方に一意の ID を追加すると、メッセージ ID とシグナル ID のキーと値のペアにシリアル化される新しい MessageSignals シングルトン クラスを追加できます。次に、すべてのメッセージ、すべてのシグナル、およびすべての MessageSignal ペアリングをシリアライズおよびデシリアライズできます。次に、メッセージのすべてのシグナルを取得するためのルックアップとして MessageSignal クラスを使用します。

  public IEnumerable<Signal> Signals
  {
    get
    {
      return from signal in Signals
      from ms in MessageSignals
      where ms.MessageId == this.MessageId && ms.SignalId==signal.Id
      select signal;
    }
  }

これは、ほとんどのデータベースで多対多の関係がどのように処理されるかに非常に似ています。

于 2012-07-04T10:34:22.630 に答える