Java 为什么XMLDecoders readObject方法在尝试读取对象时抛出了畸形的DurLexception?
我正在尝试实例化一个设置类。此外,我正在使用单例模式。这是我的密码:Java 为什么XMLDecoders readObject方法在尝试读取对象时抛出了畸形的DurLexception?,java,Java,我正在尝试实例化一个设置类。此外,我正在使用单例模式。这是我的密码: package com.op.OccupancyPrediction.BusinessLogic.utility; import java.beans.XMLDecoder; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; public class Settin
package com.op.OccupancyPrediction.BusinessLogic.utility;
import java.beans.XMLDecoder;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class Settings {
private int preHeatTimeIntervalInMinutes;
private double PIROccupiedValue;
private int hoursPerDay;
private int minutesPerHour;
private static Settings instance = null;
private Settings()
{
}
public static Settings getInstance() {
if(instance == null) {
instance = new Settings();
try {
XMLDecoder d = new XMLDecoder(
null, new BufferedInputStream(
new FileInputStream("Settings.xml")));
instance = (Settings) d.readObject();
d.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return instance;
}
return instance;
}
public int getPreHeatTimeIntervalInMinutes() {
return preHeatTimeIntervalInMinutes;
}
public void setPreHeatTimeIntervalInMinutes(int preHeatTimeIntervalInMinutes) {
this.preHeatTimeIntervalInMinutes = preHeatTimeIntervalInMinutes;
}
public double getPIROccupiedValue() {
return PIROccupiedValue;
}
public void setPIROccupiedValue(double pIROccupiedValue) {
this.PIROccupiedValue = pIROccupiedValue;
}
public int getHoursPerDay() {
return hoursPerDay;
}
public void setHoursPerDay(int hoursPerDay) {
this.hoursPerDay = hoursPerDay;
}
public int getMinutesPerHour() {
return minutesPerHour;
}
public void setMinutesPerHour(int minutesPerHour) {
this.minutesPerHour = minutesPerHour;
}
}
XML文档位于根文件夹中,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0" class="java.beans.XMLDecoder">
<object class="com.op.OccupancyPrediction.BusinessLogic.utility.Settings">
<void property="preHeatTimeIntervalInMinutes">
<int>15</int>
</void>
<void property="PIROccupiedValue">
<double>30</double>
</void>
<void property="hoursPerDay">
<int>24</int>
</void>
<void property="minutesPerHour">
<int>60</int>
</void>
</object>
</java>
我找到了一个解决办法,所以我会回答我自己的问题。这可能对其他人有帮助。由于Settings类的构造函数不是公共的,因此在尝试调用readObject时将引发异常。我的解决方案:
package com.op.OccupancyPrediction.BusinessLogic.utility;
import java.beans.XMLDecoder;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class SettingsWrapper {
private static SettingsWrapper instance = null;
private static Settings settings = null;
private SettingsWrapper() {
// Exists only to defeat instantiation.
}
public static SettingsWrapper getInstance() {
if (instance == null) {
instance = new SettingsWrapper();
}
return instance;
}
public Settings GetSettings() {
if(settings == null)
{
settings = new Settings();
try {
XMLDecoder d = new XMLDecoder(new BufferedInputStream(
new FileInputStream("Settings.xml")));
settings = (Settings) d.readObject();
d.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
return settings;
}
}
stacktrace?代码中的相关位置?此外,如果您希望在多个线程中工作,那么您的单例逻辑不是线程安全的。我用stacktrace编辑了我的问题。稍后我会使它成为线程安全的,谢谢。@jtahlborn我发现这个方法是在设置类构造函数不是公共的时候抛出的
package com.op.OccupancyPrediction.BusinessLogic.utility;
import java.beans.XMLDecoder;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class SettingsWrapper {
private static SettingsWrapper instance = null;
private static Settings settings = null;
private SettingsWrapper() {
// Exists only to defeat instantiation.
}
public static SettingsWrapper getInstance() {
if (instance == null) {
instance = new SettingsWrapper();
}
return instance;
}
public Settings GetSettings() {
if(settings == null)
{
settings = new Settings();
try {
XMLDecoder d = new XMLDecoder(new BufferedInputStream(
new FileInputStream("Settings.xml")));
settings = (Settings) d.readObject();
d.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
return settings;
}
}