-
Bug
-
Resolution: Fixed
-
P3
-
7, 7u15
-
b98
Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build |
---|---|---|---|---|---|---|
JDK-8050484 | 7u80 | Aleksej Efimov | P3 | Resolved | Fixed | b02 |
JDK-8061059 | 7u79 | Aleksej Efimov | P3 | Resolved | Fixed | b01 |
JDK-8057383 | 7u76 | Aleksej Efimov | P3 | Resolved | Fixed | b01 |
JDK-8051643 | 7u75 | Aleksej Efimov | P3 | Resolved | Fixed | b01 |
JDK-8050814 | 7u72 | Aleksej Efimov | P3 | Closed | Fixed | b05 |
JDK-8057811 | 7u67 | Aleksej Efimov | P3 | Resolved | Fixed | b33 |
java version " 1.7.0_15 "
Java(TM) SE Runtime Environment (build 1.7.0_15-b03)
Java HotSpot(TM) Client VM (build 23.7-b01, mixed mode, sharing)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows XP [Version 5.1.2600]
A DESCRIPTION OF THE PROBLEM :
If Bean properties are initialized with static values, XMLEncoder.writeObject sometimes writes out nonsense. So XMLDecoder.readObject can't read the Java bean correctly. See example!
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Type in the given example (Class Test) and run it. It writes out a wrong serialization of Test$MyClass.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The expected result from the Test example is:
<?xml version= " 1.0 " encoding= " UTF-8 " ?>
<java version= " 1.7.0_15 " class= " java.beans.XMLDecoder " >
<object class= " Test$MyClass " >
<void id= " Boolean0 " property= " gut " />
<void property= " info " >
<object class= " Test$Info " >
<void property= " enabled " >
<object idref= " Boolean0 " />
</void>
<void property= " IEin " >
<int>1</int>
</void>
</void>
</void>
<void property= " sticky " >
<boolean>false</boolean>
</void>
</object>
</java>
OK
You can produce this output by changing in the example the line
private Info info = new Info();
to
private Info info;
ACTUAL -
The example produces the following wrong output:
<?xml version= " 1.0 " encoding= " UTF-8 " ?>
<java version= " 1.7.0_15 " class= " java.beans.XMLDecoder " >
<object class= " Test$MyClass " >
<void property= " info " >
<void property= " IEin " >
<int>1</int>
</void>
<void property= " enabled " >
<void class= " Test$MyClass " id= " Test$MyClass0 " >
<void id= " Boolean0 " property= " gut " />
<void property= " sticky " >
<boolean>false</boolean>
</void>
</void>
<object idref= " Boolean0 " />
</void>
</void>
</object>
</java>
Expected sticky=false, but is=null
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
public class Test {
public static void main(String[] args) throws Exception {
MyClass m = new MyClass();
m.setSticky(Boolean.FALSE);
Info omi = new Info();
omi.setEnabled(Boolean.TRUE);
omi.setIEin(new Integer(1));
m.setInfo(omi);
ByteArrayOutputStream arraystream = new ByteArrayOutputStream();
XMLEncoder encoder = new XMLEncoder(arraystream);
encoder.writeObject(m);
encoder.close();
arraystream.close();
System.out.println(arraystream.toString());
XMLDecoder decoder = new XMLDecoder(new ByteArrayInputStream(arraystream.toByteArray()));
m = (MyClass) decoder.readObject();
decoder.close();
if (!Boolean.FALSE.equals(m.getSticky())) {
System.out.println( " Expected sticky=false, but is= " + m.getSticky());
} else {
System.out.println( " OK " );
}
}
public static class MyClass {
private Info info = new Info();
public Info getInfo() {
return this.info;
}
public void setInfo(Info anInfo) {
this.info = anInfo;
}
private Boolean gut = Boolean.TRUE;
public java.lang.Boolean getGut() {
return this.gut;
}
public void setGut(Boolean gut) {
this.gut = gut;
}
private Boolean sticky;
public Boolean getSticky() {
return this.sticky;
}
public void setSticky(Boolean sticky) {
this.sticky = sticky;
}
}
public static class Info {
private Integer iEin;
public Integer getIEin() {
return this.iEin;
}
public void setIEin(Integer iEin) {
this.iEin = iEin;
}
private Boolean enabled;
public Boolean getEnabled() {
return this.enabled;
}
public void setEnabled(Boolean enabled) {
this.enabled = enabled;
}
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Avoid setting bean properties to static values, especially when the bean is instantiated (constructor or variable declaration).
- backported by
-
JDK-8050484 java.beans.XMLEncoder.writeObject output is wrong
-
- Resolved
-
-
JDK-8051643 java.beans.XMLEncoder.writeObject output is wrong
-
- Resolved
-
-
JDK-8057383 java.beans.XMLEncoder.writeObject output is wrong
-
- Resolved
-
-
JDK-8057811 java.beans.XMLEncoder.writeObject output is wrong
-
- Resolved
-
-
JDK-8061059 java.beans.XMLEncoder.writeObject output is wrong
-
- Resolved
-
-
JDK-8050814 java.beans.XMLEncoder.writeObject output is wrong
-
- Closed
-
- duplicates
-
JDK-8044790 Serializing objects with XMLDecoder fails with Java 7
-
- Closed
-
- relates to
-
JDK-8044790 Serializing objects with XMLDecoder fails with Java 7
-
- Closed
-