将数组读/写到文件中

时间:2017-06-01 08:55:26

标签: c# save load

我需要指导,有人指出我正确的方向。正如tittle所说,我需要将信息保存到文件:日期,字符串,整数和整数数组。当用户想要查看时,我还需要能够在以后访问该信息。 可选:文件是纯文本,我可以直接检查它,这是可以理解的。 如果选择的方法可以轻松地获得奖励积分"转换为将来使用数据库而不是单个文件。

我对C#很陌生,到目前为止我发现的是我应该将数组转换为带分隔符的字符串。

那么,你们建议的是什么?

4 个答案:

答案 0 :(得分:1)

// JSON.Net
string json = JsonConvert.SerializeObject(objOrArray);
File.WriteAllText(path, json);
// (note: can also use File.Create etc if don't need the string in memory)

...或

using(var file = File.Create(path)) { // protobuf-net
    Serializer.Serialize(file, objOrArray);
}

第一个是可读的;第二个会更小。两者都可以很好地处理“日期,字符串,整数和整数数组”,或者这些对象的数组。 Protobuf-net需要添加一些属性来帮助它,但真的简单。

至于使用数据库作为列 ...整数数组是那里的故障,因为大多数数据库不支持“整数数组”作为列类型。我会说“关注点分离” - 有一个单独的数据库持久性模型。如果您纯粹使用数据库来存储文档,那么:几乎每个数据库都支持CLOB和BLOB数据,因此要么可用。许多数据库现在都内置了JSON支持(辅助方法等),这可能会使JSON成为一个更有诱惑力的CLOB。

答案 1 :(得分:0)

我可能将此序列化为json并将其保存在某个地方。 Json.Net是一种非常流行的方式。

这样做的好处还在于创建了一个可以在以后用于处理对象关系映射器的类。

    var userInfo = new UserInfoModel();


    // write the data (overwrites)
    using (var stream = new StreamWriter(@"path/to/your/file.json", append: false))
    {
        stream.Write(JsonConvert.SerializeObject(userInfo));   
    }

    //read the data
    using (var stream = new StreamReader(@"path/to/your/file.json"))
    {
        userInfo = JsonConvert.DeserializeObject<UserInfoModel>(stream.ReadToEnd());
    }

    public class UserInfoModel
    {
         public DateTime Date { get; set; }
        // etc.
    }

答案 2 :(得分:0)

对于纯文本文件,你是对的。 每个条目使用1行: 日期 串 整数 整数数组

如果您阅读代码中的文件,您可以通过逐行阅读轻松分隔它们。

使用特定的Seperator创建一个字符串: [1,2,3] - &gt; “1,2,3” 当您读取该行时,您可以通过“,”拆分字符串,并获取一个字符串数组。将每个条目解析为int到具有相同长度的Int数组。

如何阅读和编写文件,请查看Easiest way to read from and write to files

如果您确实希望在某个时刻切换到数据库,请尝试使用JSON格式的文件。它易于操作,并且有一些很好的插件可以使用。

厂家批号 Henne的

答案 3 :(得分:-1)

我开始使用C#的方式是通过Steam平台的Space Engineers游戏,Mods需要在本地保存文件(%AppData%\Local\Temp\SpaceEngineers\%AppData%\Roaming\SpaceEngineers\Storage\)以进行各种设置,并且他们的日志记录是类似于@H。 Sandberg提到(逐行,也许是稍后要解析的分隔符),这样做的好处在于它易于检索,易于追加,易于覆盖,而且我非常确定它&#39 ;甚至可以检索文件大小,当与文件删除和文件创建结合使用时可以防止失控的文件大小,因为这允许您设置上限进行检查,允许您在服务器上运行它,影响最小(可能是最好的)要包含最小日期过滤器{确保X至少Y天,然后再将其删除Z Bytes}以防止调试数据丢失{&#34;为什么会这样超过这个限制?&#34;})

就这个想法背后的实际代码而言,我与OP大致处于相同的技能水平,也就是说;菜鸟,但是我建议你看看太空工程师Mods中的Coding中的一些样本(加上它对于Beta游戏并不是一半坏),因为它们几乎都是用C#编写的。此外,可编程块也在C#中编译,因此您可以使用它来帮助学习C#并加强和利用您已经知道的内容(尽管出于安全原因不允许使用某些C#命令)使用Mod API,您可以更灵活地执行诸如创建/维护日志文件,检索/修改对象属性等操作。),您甚至可以在游戏文本监视器中打印各种文本。

如果我的语法需要一些工作,我很抱歉。对不起,我目前无法正在编写一些代码来解决您的问题,但我知道

using System;
Console.WriteLine("Hello World");

所以至少它不是完全丢失,但我的示例代码很可能不会编译,因为它可能会遗漏一些内容,例如:输出位置,也许是API参考或两个,可能还有一些其他设置。就像我说的那样,我是New,但那是一个有效的C#命令,我知道我的那部分是正确的。

编辑:这是一次更好的尝试:

using System;
class Test
{
    static void Main()
    {
        string a = "Hello Hal, ";
        string b = "Please open the Airlock Doors.";
        string c = "I'm sorry Dave, "
        string d = "I'm afraid I can't do that."
        Console.WriteLine(a + b);
        Console.WriteLine(c + d);
        Console.Read();
    }
}

此:

"Hello Hal, Please open the Airlock Doors."
"I'm sorry Dave, I'm afraid I can't do that."

应该是结果。 (&#34;报价标记&#34;不应出现在读数{最后一个代码块}中,这只是为了提高可读性)

相关问题