Hi,
I do not have any experience with serialisation and deserialisation. I did
not find any custom serialize() and deserialize() methods in criteria, but
I thought the JDK handles this automatically. Ist that not true ?
By the way, I do not see the Criteria object as a long-lived object. They
tend to get modified in Queries, so I usually just throw them away after
they are used.
Thomas
Robert Kromkamp <[EMAIL PROTECTED]> schrieb am 29.03.2005 09:20:56:
> I had the same problem. To solve it I've written my own serialize and
> deserialize functions for Criteria.java for torque 3.1.1:
>
> /** Serialize this Object in a manner which is binary-compatible with the
> JDK */
> private void writeObject(ObjectOutputStream s) throws IOException {
> ObjectOutputStream.PutField oFields;
> Iterator it = entrySet().iterator();
> Map.Entry oEntry;
> oFields = s.putFields();
>
> oFields.put("offset", this.offset);
> oFields.put("limit", this.limit);
> oFields.put("ignoreCase", ignoreCase);
> oFields.put("singleRecord", isSingleRecord());
> oFields.put("cascade", isCascade());
> oFields.put("dbName", getDbName());
>
> oFields.put("selectModifiers",
> getSelectModifiers());
> oFields.put("selectColumns", getSelectColumns());
> oFields.put("orderByColumns", getOrderByColumns());
>
> oFields.put("groupByColumns", getGroupByColumns());
> oFields.put("having", getHaving());
> oFields.put("asColumns", getAsColumns());
> oFields.put("joinL", getJoinL());
> oFields.put("joinR", getJoinR());
> oFields.put("aliases", this.aliases);
>
> oFields.put("useTransaction", this.useTransaction);
> oFields.put("originalDbName", this.originalDbName);
>
> s.writeFields();
>
> //s.writeInt(capacity);
> s.writeInt(super.size());
> while (it.hasNext())
> {
> oEntry = (Map.Entry) it.next();
> String key = (String)oEntry.getKey();
> s.writeObject(key);
> s.writeObject(oEntry.getValue());
>
> if (this.containsKey(key)){
> Criterion aCriterion =
> this.getCriterion(key);
> s.writeObject(aCriterion);
> } else {
> s.writeObject(new Boolean(false));
> }
> }
> }
>
>
>
> /** Deserialize this Object in a manner which is binary-compatible
with
> the JDK */
>
> private void readObject(ObjectInputStream s) throws IOException,
> ClassNotFoundException
> {
> int i;
> int iLen;
> Object oKey, oValue, oCriterion;
> ObjectInputStream.GetField oFields;
> oFields = s.readFields();
>
> this.offset = oFields.get("offset", 0);
> this.limit = oFields.get("limit", -1);
> ignoreCase = oFields.get("ignoreCase", false);
> singleRecord = oFields.get("singleRecord", false);
> cascade = oFields.get("cascade", false);
> dbName = (String) oFields.get("dbName", "");
> selectModifiers = (UniqueList)
> oFields.get("selectModifiers", new UniqueList());
> selectColumns = (UniqueList)
> oFields.get("selectColumns", new UniqueList());
> orderByColumns = (UniqueList)
> oFields.get("orderByColumns", new UniqueList());
>
> groupByColumns =
> (UniqueList)oFields.get("groupByColumns", new UniqueList());
>
> having = (Criteria.Criterion)oFields.get("having",
> null);
> asColumns = (Hashtable)oFields.get("asColumns",
> null);
> joinL = (ArrayList)oFields.get("joinL", null);
> joinR = (ArrayList)oFields.get("joinR", null);
> aliases = (HashMap)oFields.get("aliases", null);
>
> useTransaction = oFields.get("useTransaction",
> false);
> originalDbName =
> (String)oFields.get("originalDbName", "");
>
> iLen = s.readInt();
>
> for (i = 0; i < iLen; i++){
> oKey = s.readObject();
> oValue = s.readObject();
> super.put(oKey, oValue);
>
> oCriterion = s.readObject();
> if (oCriterion instanceof
> org.apache.torque.util.Criteria.Criterion){
> Criterion criterion = (Criterion)
> oCriterion;
> add(criterion);
> }
> }
> }
>
>
> -----Original Message-----
> From: Joe Morrogh [mailto:[EMAIL PROTECTED]
> Sent: maandag 28 maart 2005 3:54
> To: [email protected]
> Subject: Problem with Criteria After Deserializing
>
>
> Hi,
>
> I've got a Torque 3.0 application (part of a Turbine 2.2 webapp) and I
want
> to add persistent query
> funtionality to it. Since the Torque Criteria class already represents a
> set of query criteria, and is serializable, it seems logical to persist
> instances of this class for my purposes. The problem I'm
> having is that the deserialized Criteria object doesn't behave exactly
the
> same as the object that
> existed prior to serialization. Specifically, my Criterion objects in
the
> hash seem to contain an
> addtional layer of Criterion objects after deserialization. For example,
if
>
> my search criteria is "MY_TABLE.MYCOLUMN = 'AAA'", before
serialization,
> I've got one Criterion in the hash whose value is "AAA". After
> serialization, I've still got one Criterion in the hash, but the value is
> not the String
> "AAA", but another Criterion object, whose value is then "AAA". The end
> result of all this is that when the query is generated, I end up with an
> invalid query like:
>
> select * from MY_TABLE where MYCOLUMN=MYCOLUMN='AAA'
>
> I'm rying to avoid coding my own classes to represent the "where clause".
> Any ideas?
>
> TIA,
> Joe
>
> Below is a simple program that demonstrates the problem.
>
>
> import java.io.*;
> import org.apache.torque.util.Criteria;
>
> public class SerializeCriteriaTest {
>
> public static void main(String args[]) throws Exception {
>
> System.out.println("Entering SerializeCriteriaTest::main");
> Criteria criteria = new Criteria();
> criteria.add("MY_TABLE.MYCOLUMN", (Object) "AAA",
> Criteria.EQUAL);
> System.out.println(criteria.toString());
>
> ByteArrayOutputStream bas = new ByteArrayOutputStream();
> ObjectOutputStream oos = new ObjectOutputStream(bas);
> oos.writeObject(criteria);
> byte [] bytes = bas.toByteArray();
> System.out.println("the length of bytes is " + bytes.length);
>
> Criteria criteriaReborn =
> (Criteria) new ObjectInputStream(new
> ByteArrayInputStream(bytes)).readObject();
> System.out.println(criteriaReborn.toString());
>
> }} // end class
>
>
> Here's the stdout
>
> Entering SerializeCriteriaTest::main
> Criteria:: MY_TABLE.MYCOLUMN<=>MY_TABLE.MYCOLUMN='AAA':
> Current Query SQL (may not be complete or applicable):
> the length of bytes is 1544
> Criteria:: MY_TABLE.MYCOLUMN<=>MY_TABLE.MYCOLUMN=MY_TABLE.MYCOLUMN='AAA':
> Current Query SQL (may not be complete or applicable):
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]