草庐IT

java - 在 Java 中将对象序列化为 XML 会忽略我的对象的一些变量字段

coder 2024-06-29 原文

我试图将我的对象序列化为一个 xml 文件,问题是这个对象的一些实例变量没有写在 xml 文件中。 我不知道为什么它们会被忽略,也不知道如何获取序列化方法来将每个变量写入 xml 文件中。 我注意到,当我设置(使用 setter )时,其中一些变量更有可能写入 xml 文件。

我要问的是:

1- 我想知道为什么有些实例变量在对象被序列化时没有写在 XML 文件中。

2- 当我将该对象序列化为 XML 时,如何强制将该对象的所有实例变量写入文件。


我的类(class)

package DBMS;

import JDBC.ResultSetMetaData;

public class Column {

private String colName= "";
private String type="";
private boolean isPrimary= false;
private boolean isAutoIncrement= false;
private int NullableState = ResultSetMetaData.columnNullableUnknown;
private boolean isReadOnly= false;
private boolean isSearchable= true;
private String tableName= "unknown";
private int incrementNextValue = 1;


public Column() {
    // TODO Auto-generated constructor stub

}

public Column(String n, String t) {

    colName = n;
    type=t;
}


public String getTableName() {
    return tableName;
}

public void setTableName(String s) {
    tableName = s;
}

public String getColName() {
    // TODO Auto-generated method stub
    return colName;
}

public void setColName(String s) {
    // TODO Auto-generated method stub
    colName = s;
}

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}

public boolean isPrimary() {
    return isPrimary;
}

public void setPrimary(boolean isPrimary) {
    this.isPrimary = isPrimary;
}

public boolean isAutoIncrement() {
    return isAutoIncrement;
}

public void setAutoIncrement(boolean isAutoIncrement) {
    this.isAutoIncrement = isAutoIncrement;
}

public int getNullableState() {
    return NullableState;
}

public void setNullable(int Nullable) {
    this.NullableState = Nullable;
}

public boolean isReadOnly() {
    return isReadOnly;
}

public void setReadOnly(boolean isReadOnly) {
    this.isReadOnly = isReadOnly;
}

public boolean isSearchable() {
    return isSearchable;
}

public void setSearchable(boolean isSearchable) {
    this.isSearchable = isSearchable;
}

public int getIncrementNextValue() {
    return incrementNextValue;
}

public void setIncrementNextValue(int incrementNextValue) {
    this.incrementNextValue = incrementNextValue;
}

}

方法序列化

public  void serializeObjectToXML(String xmlFileLocation, ArrayList<Column> objectToSerialize) throws Exception {

    FileOutputStream os = new FileOutputStream(xmlFileLocation);
    XMLEncoder encoder = new XMLEncoder(os);
    encoder.writeObject(objectToSerialize);
    encoder.close();
    os.close();
}

示例 xml 输出

 <?xml version="1.0" encoding="UTF-8"?>
 -<java class="java.beans.XMLDecoder" version="1.7.0_07">
 -<object class="java.util.ArrayList">
 -<void method="add"> 
 -<object class="DBMS.Column">
 -<void property="autoIncrement"> <boolean>true</boolean> </void> 
 -<void property="colName"> <string>ID</string> </void> 
 -<void property="readOnly"> <boolean>true</boolean> </void> 
 -<void property="tableName"> <string>testSerialize</string> </void> 
 -<void property="type"> <string>int</string> </void> </object> </void>
 -<void method="add">
 -<object class="DBMS.Column">
 -<void property="colName"> <string>Name</string> </void> 
 -<void property="primary"> <boolean>true</boolean> </void>
 -<void property="tableName"> <string>testSerialize</string> </void>
 -<void property="type"> <string>string</string> </void> </object> </void> -<void    method="add"> 
 -<object class="DBMS.Column"> 
 -<void property="colName"> <string>info</string> </void>
 -<void property="tableName"> <string>testSerialize</string> </void> -<void property="type"> <string>string</string> </void> </object> </void> 
 -<void method="add">
 -<object class="DBMS.Column">
 -<void property="colName"> <string>data</string> </void>
 -<void property="tableName"> <string>testSerialize</string> </void>
 -<void property="type"> <string>string</string> </void> </object> </void> </object> </java>

最佳答案

有两点值得注意:

  1. XMLEncoder 不查看私有(private)字段。它只查看匹配的“get”和“set”方法对(或“is”和“set”方法)。您有一个 getNullableState 方法,但设置方法不匹配;您应该将 setNullable 重命名为 setNullableState
  2. XMLEncoder 只为与其初始状态不同的属性写入值。每个属性的初始状态是对象最初构造时它具有的任何值。

因此,强制写入属性值的一种方法是确保它的值与构造对象时的值不同。

如果您想始终为每个属性编写 XML,您可能需要考虑使用 JAXB而不是 XMLEncoder。

关于java - 在 Java 中将对象序列化为 XML 会忽略我的对象的一些变量字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20306992/

有关java - 在 Java 中将对象序列化为 XML 会忽略我的对象的一些变量字段的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  3. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  4. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  5. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  6. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  7. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  8. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  9. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  10. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

随机推荐