【发布时间】:2013-06-15 02:41:53
【问题描述】:
将 CSV 格式的数据放在 xml 元素中的优缺点是什么?
我必须在 java 中将带有矩阵数据字段的对象序列化为 xml。我放弃了在 Jaxb 中使用数据绑定的想法;泛型和包含集合的集合太难处理了。
我为我的矩阵考虑了一个简单的模式,但是由于我还必须将矩阵序列化为 CSV,为什么不直接将 CSV 字符串作为文本节点转储到元素中呢?它还会使文件更小。
你能想出反对这个想法的论据吗?
我应该向这个元素添加类似 csv mimetype 的东西吗?
编辑:这是我选择的解决方案。它使用 Super-CSV。需要枚举,因为泛型类型在运行时被擦除。主 xml 文件将引用 csv 文件。
static public enum SerializableType{INTEGER,DOUBLE,...};
@SuppressWarnings("unchecked")
public static <T> Matrix<T> fromCSV(InputStream in, CsvPreference pref, SerializableType t)
{
Matrix<T> o = new Matrix<T>();
// Super-csv class
CsvListReader csv_reader = new CsvListReader(new InputStreamReader(in), pref);
Integer n = null;
try {
List<String> l = csv_reader.read();
n = l.size(); o.n = n;
int i=0;
while(l!=null)
{
o.appendRow();
T val;
for(int j=0;j<n;j++)
{
switch(t)
{
case INTEGER:
val = (T)Integer.valueOf(Integer.parseInt(l.get(j)));
break;
case DOUBLE:
val = (T)Double.valueOf(Double.parseDouble(l.get(j)));
break;
case <...>
default:
throw new IllegalArgumentException();
}
o.set(i,j, val);
}
i++;
l = csv_reader.read();
}
csv_reader.close();
} catch (IOException e) {
e.printStackTrace();
}
return o;
}
public static<T> void toCSV(Matrix<T> m, CsvListWriter csv_writer, SerializableType t)
{
try {
for(int i=0;i<m.rowCount();i++)
{
ArrayList<String> l = new ArrayList<String>();
for(int j=0;j<m.columnCount();j++)
{
if(m.get(i,j)==null)
{
l.add(null);
}
else{
switch(t)
{
case INTEGER:
l.add(Integer.toString((Integer)m.get(i,j)));
break;
case DOUBLE:
l.add(Double.toString((Double)m.get(i,j)));
break;
case
<...>
default:
throw new IllegalArgumentException();
};
}
}
csv_writer.write(l);
}
csv_writer.flush();
csv_writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
【问题讨论】:
-
在阅读了一些简洁的 w3c 规范(哎呀,这伤害了我的大脑......)和一些维基百科文章之后,我想我会使用 jar 和 XInclude 的组合。我将使用 mimetype application/csv 将 csv 文件的 jar-archive-relative 路径放在一些 xml 属性(我将其命名为 type)中。必须序列化的主要类型的成员数据字段对象将位于 jar 中它们自己的 xml 文件中,主文件将包含它们。
标签: java xml csv jaxb xml-serialization