Newsgroup: it.comp.dotnet
Titolo: Ordine di deserializzazione e dipendenze tra classi

Ciao a tutti.
Sto avendo problemi con la serializzazione di alcune classi mediante il 
DataContractSerializer, nello specifico ho notato che nell'ordine di 
deserializzazione non viene tenuto conto di alcune dipendenze tra 
classi. Mi spiego meglio:
(premetto che l'attributo [Serializable] è usato per un'altra 
serializzazione fatta "a mano" con XmlSerializer)
data una classe:
[DataContract][Serializable]
[KnownType(typeof(EventCondition))]
public class UserStyle
{
	[DataMember]
	public Condition Condition { get; set; }
	////[...]
 
	[DataMember]
	protected Dictionary<Condition, List<Response>> responseEscalationMap;
	[DataMember]
	public Response DefaultResponse
	{
		get
		{
			List<Response> respList = this[EventCondition.NoneCondition] as 
List<Response>;
			if (respList.Count == 0)
				return null;
			return respList[0];
		}
		set
		{
			List<Response> respList = this[EventCondition.NoneCondition] as 
List<Response>;
			respList[0] = value;
		}
	}
	/// <summary>
	/// indexer for responseEscalationMap
	/// </summary>
	/// <param name="evt"></param>
	/// <returns></returns>
	public ICollection<Response> this[Condition evt]
	{
		get
		{
			return responseEscalationMap[evt];
		}
	}
 
	///etc. etc.
}
e quest'altra:
[DataContract]
public class EventCondition : Condition
{
	[DataMember]
	public static readonly Condition NoneCondition = new 
Condition(CommonStrings.NoneConditionName);
	[DataMember]
	public static readonly Condition NoMatchCondition = new 
Condition(CommonStrings.NoMatchConditionName);
	[DataMember]
	public static readonly Condition NoInputCondition = new 
Condition(CommonStrings.NoInputConditionName);
	[DataMember]
	public static readonly Condition TooMuchCondition = new 
Condition(CommonStrings.TooMuchConditionName);
	[DataMember]
	public static readonly List<Condition> PlatformConditions = new 
List<Condition> { NoneCondition, NoMatchCondition, NoInputCondition, 
TooMuchCondition };
	public EventCondition(string name)
		: base(name)
	{
	}
	public EventCondition()
		: base()
	{
	}
	[OnDeserializing]
	private void OnDeserializing(StreamingContext context)
	{
	}
}
succede che la seconda classe viene deserializzata dopo la prima, con il 
problema che nel Dictionary responseEscalationMap la Condition usata 
come chiave quando viene deserializzato DefaultResponse non è l'istanza 
valorizzata con il valore salvato, ma con il valore statico 
inizializzato alla partenza dall'applicazione, quindi la chiave 
EventCondition.NoneCondition non viene trovata nel dictionary.
Il problema non ci sarebbe se la classe EventCondition venisse 
deserializzata per prima.
Come posso forzare questa cosa (sempre che non abbia fatto errori 
strutturali che non capisco per cui la cosa è in sé sbagliata)?
Esiste qualcosa di non documentato tipo la clausola "order" 
dell'attributo DataMember per l'intera classe oltre che per i membri?
Grazie e ciao

 classi.
Ho trovato la causa del problema: i membri statici non vengono 
serializzati, dunque non posso usarli come chiavi perché il loro stato 
non viene salvato. Quando accedo al dictionary, ci accedo sempre col 
valore istanziato dal clr, non con quello salvato, con buona pace della 
persistenza.
Morale della favola: devo cambiare chiavi o devo spostarle in un altro 
contesto non statico.
Ciao