XmlSerializer 是不是会返回一个太长而不能成为 Java 字符串的字符串?

Posted

技术标签:

【中文标题】XmlSerializer 是不是会返回一个太长而不能成为 Java 字符串的字符串?【英文标题】:Could it happen that XmlSerializer returns a String which is too long to be a string in Java?XmlSerializer 是否会返回一个太长而不能成为 Java 字符串的字符串? 【发布时间】:2015-04-26 08:38:49 【问题描述】:

我目前正在构建一个 android 应用程序,并决定使用 Xml 实现而不是数据库来存储数据。 我在应用程序启动时将 xml 文件加载到列表中,当我想将其保存回来时,我使用 XmlSerializer 将其格式化为 xml,然后输出到 StringWriter。 然后我在 StringWriter 对象上调用 .toString() 并将该字符串写回文件中。

然而,我注意到应用程序 xml 文件增长得非常快,并且想知道如果它的长度超过最大字符串长度会发生什么。 有没有办法从 StringWriter 获取字符串数组? 这是我的序列化器方法。

public String articlesAsXml() 
XmlSerializer serializer = Xml.newSerializer();
StringWriter writer = new StringWriter();
try 
        serializer.setOutput(writer);
        serializer.startDocument("UTF-8", true);
        serializer.startTag("", "articles");
        for (Articles art: AllArticles)

            serializer.startTag("", "art");

            serializer.startTag("", "id");
            serializer.text(art.Article_Id);
            serializer.endTag("", "id");

            serializer.startTag("", "title");
            serializer.text(art.Article_Title);
            serializer.endTag("", "title");

            serializer.startTag("", "body");
            serializer.text(art.Article_Body);
            serializer.endTag("", "body");

            serializer.endTag("", "art");
        
        serializer.endTag("", "articles");
        serializer.endDocument();
        return writer.toString();
    
    catch (Exception e)  return "Failed"; 
    return null;

提前致谢

【问题讨论】:

不确定您是否欢迎对设计提出批评,但如果您担心 XML 的大小超过字符串的最大长度,您必须想象应用程序的性能随着时间的推移会显着退化。牢记解析/内存使用情况,您很快就会遇到麻烦。我会考虑使用数据库,或者至少将 XML 拆分为多个文件。关于您的问题,这可能会提供一些见解***.com/questions/816142/… 是的,我当然欢迎批评。我是来学习的。我唯一的问题是我之前没有意识到这个问题,所以我构建了我的整个应用程序依赖于这个系统,因为它必须从文章中加载其他东西。非常感谢您的回答 :) 所以我认为最好的移动方式是为我的应用程序的第一个版本实施 Natixs 解决方案,然后开始使用其他版本的数据库。 【参考方案1】:

一个字符串可能与你有多少空闲堆内存一样长。如果你用完它,你会得到一个OutOfMemoryError

一种解决方案是不使用 StringWriter(它为稍后将写入文件的数据临时分配内存),而是直接将数据写入文件。

BufferedWriter writer = null;
try 
    writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
    serializer.setOutput(writer);
    ...
 catch (IOException e) 
    Log.e(tag, "cannot write to file " + file, e);
 finally 
    if (writer != null) 
        try 
            writer.close();
         catch (IOException e) 
            Log.e(tag, "cannot close file " + file, e);
        
    

【讨论】:

感谢您的回答!我会开始努力的:)

以上是关于XmlSerializer 是不是会返回一个太长而不能成为 Java 字符串的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 UILabel 是不是被截断?

无法更改后退栏按钮文本

如何找出截断的 UILabel 文本的宽度

在 FLEX 中动态改变 Datagrid 列的宽度

UDP Socket.SendTo是否可以执行不完整的发送?

HTML - 如何将段落分成同样宽的行?