2009-04-27 4 views
3

J'essaie de sérialiser un DetachedCriteria afin que je puisse l'enregistrer dans une base de données et réutiliser les mêmes critères à une date ultérieure. Quand je cours le code ci-dessous je reçois "NHibernate.Criterion.DetachedCriteria ne peut pas être sérialisé parce qu'il n'a pas un constructeur sans paramètre".Serialize DetachedCriteria avec nHibernate

DetachedCriteria criteria1 = DetachedCriteria.For<SecurityObjectDTO>("so") 
    .Add(Expression.Eq("ObjectCode", "1234")); 

XmlSerializer s = new XmlSerializer(typeof(DetachedCriteria)); 
TextWriter writer = new StringWriter(); 
s.Serialize(writer, criteria1); 
writer.Close(); 

est-il un bon moyen pour sérialiser un DetachedCriteria?

+0

Pourquoi voulez-vous ? – Paco

+0

Ainsi, l'utilisateur peut créer un critère que je peux ensuite enregistrer dans la base de données pour une réutilisation ultérieure. – Craig

Répondre

1

J'ai déjà rencontré quelque chose de similaire. Ma première pensée a été de sous-classer DetachedCriteria afin que vous puissiez fournir un constructeur par défaut. Cependant, après avoir creusé la classe DetachedCriteria, je ne pense pas que cela fonctionnera. La raison est la classe CriteriaImpl, utilisée en interne par DetachedCriteria, manque également un constructeur par défaut.

En regardant XmlSerializer, il ne semble pas que cela fonctionnera si votre objet n'a pas de constructeur par défaut.

Je suis tombé sur ce poste, cependant:

How do I serialize an NHibernate DetachedCriteria object?

Sur cette base, cela pourrait fonctionner (je ne l'ai pas testé, cependant):

// Convert the DetachedCriteria to a byte array 
MemoryStream ms = new MemoryStream(); 
IFormatter formatter = new BinaryFormatter(); 
formatter.Serialize(ms, detachedCriteria); 

// Serialize the byte array 
XmlSerializer s = new XmlSerializer(typeof(byte[])); 
TextWriter writer = new StringWriter(); 
s.Serialize(writer, ms.Buffer); 
writer.Close(); 
+2

En aparté, je penserais à trouver une autre façon de représenter vos critères. Si vous pouviez le représenter sous forme de chaîne ou de valeur XML, vous pourriez grandement simplifier votre processus de sérialisation. – Doug

+0

Qu'en est-il de désérialiser à DetachedCriteria? –

Questions connexes