DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT <http://issues.apache.org/bugzilla/show_bug.cgi?id=28266>. ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND INSERTED IN THE BUG DATABASE.
http://issues.apache.org/bugzilla/show_bug.cgi?id=28266 after a file upload, the DynaActionForm is put into http session but is not serializable Summary: after a file upload, the DynaActionForm is put into http session but is not serializable Product: Struts Version: 1.1 Final Platform: All OS/Version: All Status: NEW Severity: Critical Priority: Other Component: File Upload AssignedTo: [EMAIL PROTECTED] ReportedBy: [EMAIL PROTECTED] class=org.apache.struts.action.DynaActionForm serialization: FAILED: java.io.NotSerializableException: org.apache.struts.upload.CommonsMultipartRequestHandler$CommonsFormFile I trap every session attribute with an http session listener. The form is put into the session. First of all, it is huge! Like 50k. The serialized data seams to contain beans, props and a lot of unrelated crap. Somebody obviously forgot to put a field transient. Second of all, when the form is first put, beside that its size is big, it DOES serializes, but if you try upload again, the form gets altered in some way and a new field (org.apache.struts.upload.CommonsMultipartRequestHandler$CommonsFormFile) get inserted and doesn't serializes. The only way around is to remove the form from the session at the end of an action, loosing all custom data. WARN: HTTPSESSION ATTRIBUTE ADDED: name=configUploadForm class=org.apache.struts.action.DynaActionForm serialization: ########## Value takes unusualy large space (58088 bytes) ########## ser.classes= (ignoring java.* and primitive types) org.apache.commons.beanutils.DynaProperty x 2 org.apache.struts.action.ActionForm x 1 org.apache.struts.action.ActionFormBean x 1 org.apache.struts.action.ActionForward x 1 org.apache.struts.action.ActionMapping x 1 org.apache.struts.action.DynaActionForm x 1 org.apache.struts.action.DynaActionFormClass x 1 org.apache.struts.config.ActionConfig x 1 org.apache.struts.config.ControllerConfig x 1 org.apache.struts.config.ExceptionConfig x 1 org.apache.struts.config.FormBeanConfig x 1 org.apache.struts.config.FormPropertyConfig x 1 org.apache.struts.config.ForwardConfig x 1 org.apache.struts.config.MessageResourcesConfig x 1 org.apache.struts.config.PlugInConfig x 1 org.apache.struts.config.impl.ModuleConfigImpl x 1 org.apache.struts.upload.FormFile x 1 CONTENT: ....sr.'org.apache.struts.action.DynaActionForm....*.#i...L..dyn aClasst..Lorg/apache/struts/action/DynaActionFormClass;L..dynaVa luest..Ljava/util/HashMap;xr.#org.apache.struts.action.ActionFor m.+.*v......xpsr.,org.apache.struts.action.DynaActionFormClass.f )y...A...L..configt.)Lorg/apache/struts/config/FormBeanConfig;L. .namet..Ljava/lang/String;[..propertiest.,[Lorg/apache/commons/b eanutils/DynaProperty;L..propertiesMapq.~..xpsr.'org.apache.stru ts.action.ActionFormBean..3........xr.'org.apache.struts.config. FormBeanConfig:&BV..U....Z..configuredZ..dynamicL..formPropertie sq.~..L..moduleConfigt.'Lorg/apache/struts/config/ModuleConfig;L ..nameq.~..L..typeq.~..xp..sr..java.util.HashMap......`....F..lo [EMAIL PROTECTED] che.struts.config.FormPropertyConfig...k.h.....Z..configuredI..s izeL..initialq.~..L..nameq.~..L..typeq.~..xp.....pq.~..t.!org.ap ache.struts.upload.FormFilexsr..org.apache.struts.config.impl.Mo duleConfigImpl...;..h....Z..configuredL..actionConfigsq.~..L..ac tionMappingClassq.~..L..controllerConfigt.+Lorg/apache/struts/co nfig/ControllerConfig;L..dataSourcesq.~..L..exceptionsq.~..L..fo rmBeansq.~..L..forwardsq.~..L..messageResourcesq.~..L..plugInst. .Ljava/util/ArrayList;[EMAIL PROTECTED] ../admin/ntp/updatesr.&org.apache.struts.action.ActionMapping... ..N.....xr.%org.apache.struts.config.ActionConfig...F..._...Z..c onfiguredZ..unknownZ..validateL..attributeq.~..L..exceptionsq.~. [many many pages, 50k] Here is a utility inner classe for the listener, to trace classes: static boolean IGNORE_JAVA_AND_PRIMITIVE = true; static Set ignoresClasses = new HashSet(); static { ignoresClasses.add("byte"); ignoresClasses.add("short"); ignoresClasses.add("char"); ignoresClasses.add("int"); ignoresClasses.add("long"); ignoresClasses.add("float"); ignoresClasses.add("double"); ignoresClasses.add("boolean"); ignoresClasses.add("java.lang.String"); } public static class ClassLogObjectOutputStream extends ObjectOutputStream { Map classWrittenLog; int initdepth = -1; String indent; StringBuffer sb = new StringBuffer(); ClassLogObjectOutputStream(OutputStream os, Map classWrittenLog) throws IOException { this(os, classWrittenLog, ""); } ClassLogObjectOutputStream(OutputStream os, Map classWrittenLog, String indent) throws IOException { super(os); this.classWrittenLog = classWrittenLog; this.indent = indent; } protected void annotateClass(Class cl) throws IOException { recordUsage(cl); //StringBuffer sb = new StringBuffer(); int depth = (new Throwable()).getStackTrace().length; if(initdepth<0) initdepth = depth; depth = (depth-initdepth); sb.append(indent).append(depth); //if(depth%2!=0) // sb.append(".5"); sb.append('\t'); for(int i=0; i<depth; i++) sb.append('|').append(' ');//.append(' '); sb.append(cl.getName()).append('\n'); //System.err.println(sb.toString()); super.annotateClass(cl); } void recordUsage(Class cl) throws IOException { if(classWrittenLog!=null) { String name = buildName(cl); if(!IGNORE_JAVA_AND_PRIMITIVE || (!ignoresClasses.contains(name) && !name.startsWith("java.")) ) { int[] cnt = (int[])classWrittenLog.get(name); if(cnt==null) { cnt = new int[]{1}; classWrittenLog.put(name, cnt); } else { cnt[0]++; } } } } String buildName(Class c) { if(c==null) return "<null class>"; Class type = c; if(!c.isArray()) return type.getName(); type = c.getComponentType(); return buildName(type);// + "[]"; } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]