亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通用類的 JAXB 序列化失敗

通用類的 JAXB 序列化失敗

千萬里不及你 2021-09-12 19:41:47
我正在嘗試編寫一個可以使用 Java 將設置序列化和反序列化到 XML 的類。我用 C# 成功編寫了這段代碼,它非常有用,所以我想在我的 Java 應用程序中使用類似的東西。我有以下基類,我想要序列化為 XML 的每個類都必須實現。package serializers;import java.lang.reflect.ParameterizedType;abstract class XmlSerializableObject<T> {    abstract T getDefault();    abstract String getSerializedFilePath();    String getGenericName() {        return ((Class<T>) ((ParameterizedType) getClass()            .getGenericSuperclass()).getActualTypeArguments()[0]).getTypeName();    }    ClassLoader getClassLoader() {        return ((Class<T>) ((ParameterizedType) getClass()            .getGenericSuperclass()).getActualTypeArguments()[0]).getClassLoader();    }}其中getGenericName和getClassLoader用于實例化JAXBContext. 然后我有一個基本的實現作為設置提供者public class SettingsProvider extends XmlSerializableObject<SettingsProvider> {    private Settings settings;    @Override    public SettingsProvider getDefault() {        return null;    }    @Override    public String getSerializedFilePath() {        return "C:\\Data\\__tmp.settings";    }    public Settings getSettings() {        return settings;    };    public void setSettings(Settings settings) {        this.settings = settings;    }}class Settings {    private String tmp;    public String getTmp() {        return tmp;    }    public void setTmp(String tmp) {        this.tmp = tmp;    }}現在我有以下序列化程序類package serializers;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.xml.bind.JAXBContext;import javax.xml.bind.JAXBException;import javax.xml.bind.Marshaller;import javax.xml.bind.Unmarshaller;import java.io.File;問題是JAXBContext jaxbContext = JAXBContext.newInstance(name, classLoader);拋出的調用javax.xml.bind.JAXBException:無法實例化提供程序 com.sun.xml.internal.bind.v2.ContextFactory:javax.xml.bind.JAXBException:“serializers.SettingsProvider”不包含 ObjectFactory.class 或 jaxb.index -帶有鏈接異常:[javax.xml.bind.JAXBException:“serializers.SettingsProvider”不包含 ObjectFactory.class 或 jaxb.index]我試過有和沒有ClassLoader對象都無濟于事。如何以這種方式序列化泛型類型?謝謝你的時間。
查看完整描述

3 回答

?
大話西游666

TA貢獻1817條經驗 獲得超14個贊

看起來應該是這樣JAXBContext.newInstance(SettingsProvider.class)。

JAXBContext.newInstance(String ...)方法的版本需要一個包名,正如錯誤消息所說,它應該包含一個ObjectFactory類,或jaxb.index將其引導到類的列表。


查看完整回答
反對 回復 2021-09-12
?
茅侃侃

TA貢獻1842條經驗 獲得超22個贊

您正在使用此newInstance方法:


參數:


contextPath -包含模式派生類和/或 java 到模式(JAXB 注釋)映射類的java 包名稱列表


classLoader - 該類加載器將用于定位實現類。


所以 df778899 是對的,你不應該使用這個簽名作為getGenericName返回一個完全限定的類名而不是一個包。即使是包裹,您仍然會錯過ObjectFactory.class或jaxb.index


但JAXBContext.newInstance(SettingsProvider.class)也不會奏效。你會得到一個缺少的MarshalException指示@XmlRootElement


SettingsProvider像這樣注釋:


@XmlRootElement(name = "root")

static class SettingsProvider extends XmlSerializableObject<SettingsProvider>

{


    private Settings settings;


    // [...]

最后你會得到:


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<root>

    <settings>

        <tmp>testing</tmp>

    </settings>

</root>


查看完整回答
反對 回復 2021-09-12
  • 3 回答
  • 0 關注
  • 275 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號