如何保存或存储对象的 ArrayList?

Posted

技术标签:

【中文标题】如何保存或存储对象的 ArrayList?【英文标题】:How to Save or Store an ArrayList of objects? 【发布时间】:2013-03-08 03:14:48 【问题描述】:

我的项目函数返回了一个各种类型的对象的 ArrayList,我必须将它保存或存储在某个地方以供以后分析。但是我做了一些研究,还没有找到将其存储到数据库或写入文件的方法。

如果有任何方法可以保存或存储对象的 ArrayList,我非常期待有更有效的方法来做到这一点。

【问题讨论】:

如果您正在寻找类似于 Java 序列化的东西,您可能会发现这很有帮助:msdn.microsoft.com/en-us/library/7ay27kt9(v=vs.71).aspx 为什么要发布指向 .NET 1.1 的链接? 仅供参考,.NET 中的ArrayList 已过时。请改用List<T> 【参考方案1】:

首先,您真的需要使用非泛型集合吗?几乎总是使用List<T> 比使用ArrayList 更好,除非您实际上是针对.NET 1.1,这似乎不太可能。

在 Java 中使用 ObjectOutputStream 相当于在 .NET 中使用 BinaryFormatter。您可以使用GZipStream 进行压缩。请注意,这些是类,不是命名空间 - 值得在您的脑海中清理术语。 FileOutputStreamFileInputStream 在 .NET 中均由 FileStream 表示。

还值得一提的是,在 .NET 或 Java 中使用本机二进制序列化在版本控制方面有些脆弱。您可能需要考虑使用 JSON、Protocol Buffers、Thrift、XML 等替代方案。

我个人建议您从头开始学习 C# 和 .NET,而不是在不真正了解您要移植到的语言和平台的习惯用法的情况下尝试移植 Java 代码。例如,您肯定希望使用using 语句而不是使用“手动”finally 块来处理资源。

【讨论】:

对于课堂上的错误,我深表歉意。因为我的代码中有一个错误,它说“找不到类型或命名空间名称'FileOutputStream'”所以我将它称为命名空间而不是类。【参考方案2】:

我在***上发现了一些有趣的话题:

How to quickly save/load class instance to file

Saving from List<T> to txt

我认为serialization 是您所需要的:

【讨论】:

您的推荐对我很有帮助。我正在对您的建议进行一些研究。我将返回此问题的具体解决方案。【参考方案3】:

以下将压缩对象并保存到文件:

using System;
using System.IO;
using System.IO.Compression;
using System.Runtime.Serialization.Formatters.Binary;

public static void WriteFile<T>(T obj, string path) 
 
    using (FileStream fs = File.OpenWrite(path))
    using (GZipStream gzip = new GZipStream(fs, CompressionMode.Compress))
    
        BinaryFormatter bf = new BinaryFormatter(); 
        bf.Serialize(gzip , obj); 
    
 

public static T LoadFile<T>(string path) 
  
    using (FileStream fs = File.OpenRead(path))
    using (GZipStream gzip = new GZipStream(fs, CompressionMode.Decompress))
    
        BinaryFormatter bf = new BinaryFormatter(); 
        return (T)bf.Deserialize(gzip); 
    

然后读取并解压回来。

【讨论】:

将您的代码传递到我的程序时出现很多错误。 我在新文件流(路径)处出错; fs 在当前上下文中不存在。还有path,T,gzip(T是参数,但用作变量。 我可以把ArrayList的元素转换成一个Class,然后用List存到一个文件里吗? 非常感谢您的代码。这对我来说真的很好,我认为这太不可思议了。我还在编写代码来保存 ArrayList 但无法像您的代码那样保存对象。我好幸运!我也测试了你的代码。它运行得很好,没有发现错误。再次感谢您的帮助。【参考方案4】:

到目前为止,我的问题还没有一个好的解决方案。但我对 Alina B. 的建议进行了一些研究,并获得了一些更基本的信息来做到这一点。我有一个将对象集合保存到文件的代码。 (我已将目标更改为使用 Collection 而不是 ArrayList 以使其在这种情况下更容易。

//Here I call the method with parameter of Collection of objects
Collection<object> list = new Collection<object>();
list.Add("value1");
list.Add("value2");
list.Add("value3");
SaveListToFile(list);

public void SaveListToFile(Collection<object> list)

    var serializer = new XmlSerializer(typeof(Collection<object>));
    using (var writer = new StreamWriter(Server.MapPath("~/Files/test.xml")))
        serializer.Serialize(writer, list);

在上述方法中,我使用 XmlSerializer 将对象集合写入 xml 文件。如果 Collection 中的每个元素都是字符串,则该方法运行得非常好。但是,如果我将任何其他对象添加到集合中,例如类、ArrayList 或其他对象类型,它将生成错误 (生成 XML 文档时出错。) 我不能完全保存收藏。那么如何保存一组对象,如 ArrayList、类、整数或其他类型,而不是字符串?如果你在这里,我需要更多帮助。

【讨论】:

只是附注,Collection&lt;T&gt; 应该是继承的,请改用List&lt;T&gt;【参考方案5】:

也许您可以使用二进制序列化并保存二进制文件?然后你可以使用 gzip 来压缩它。 Here's a link to an example

【讨论】:

【参考方案6】:

你真的需要 XML 吗?你可以试试二进制吗,那里有很多你不能只保存到 XML 中的数据?

【讨论】:

以上是关于如何保存或存储对象的 ArrayList?的主要内容,如果未能解决你的问题,请参考以下文章

--------学生管理系统--------

算法--线性结构

JAVA集合9ArrayList和Vector区别

如何在 Android 屏幕旋转上保存自定义 ArrayList?

从文件中重复写入和加载对象的 ArrayList

如何创建一个可以存储多个对象的arraylist类?