我有一个Model
类,其中包含Message
和Signal
的列表。
每个Message
可以包含0个,1个或更多信号。 Signal
可以同时包含0个,1个或多个消息。在使用XmlSerializer进行反序列化时,我在维护Messages和Signals之间的关系方面遇到了麻烦,同时也避免了重复的对象(在我的应用程序中,除了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(); }
}
}
我有意在List<uint> SignalIndices
类中存储Message
,其中包含Model.Signals
列表中信号的索引。但是,在序列化/反序列化时假设XmlSerializer不会搞乱索引是否安全?此外,这种方法意味着Message.Signals
获取[XmlIgnore]
属性并使用SignalIndices
列表依赖于另一个Linq,以实现与Signal.Messages
中类似的操作。
换句话说,是否可以通过与MessageCollection和SignalCollection类一起使用的类似技术来确保数据一致性(也在反序列化过程中,其中对象构造的顺序是未定义的),同时还具有Message类中的一个“真实”信号列表(List<Signal>
),它不使用Linq?
答案 0 :(得分: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派生一个新的信号类来公开模型属性。
如果以上不是一个选项,您可以向反序列化后触发的模型添加一个方法(使用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;
}
}
答案 1 :(得分:1)
如果为Message和Signal添加唯一ID,则可以添加一个新的MessageSignals单例类,该类序列化为Message id和Signal id的Key Value对。然后,您可以序列化和反序列化所有消息,所有信号和所有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;
}
}
这与大多数数据库中处理多对多关系非常类似。