Read/Write 数组到文件
Read/Write array to a file
我需要指导,需要有人为我指明正确的方向。正如标题所说,我需要将信息保存到文件中:日期、字符串、整数和整数数组。而且我还需要能够在以后当用户想要查看它时访问该信息。
可选:文件是纯文本,我可以直接检查它,它是可以理解的。
如果选择的方法可以在将来 "easily" 转换为使用数据库而不是单个文件,则加分。
我是 C# 的新手,到目前为止我发现我应该将数组转换为带分隔符的字符串。
那么,你们有什么建议吗?
// 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);
}
第一个是可读的;第二个会更小。两者都可以很好地处理 "Date, string, integer and an array of integers" 或此类对象的数组。 Protobuf-net 需要添加一些属性来帮助它,但真的简单。
至于使用数据库 作为列 ...整数数组是那里的故障,因为大多数数据库不支持 "array of integers" 作为列类型。我会说 "separation of concerns" - 有一个单独的数据库持久性模型。如果您纯粹使用数据库来存储文档,那么:几乎每个数据库都支持 CLOB 和 BLOB 数据,因此两者都可用。许多数据库现在内置了 JSON 支持(辅助方法等),这可能会使 JSON 作为 CLOB 更具吸引力。
我可能会将其序列化为 json 并将其保存在某处。 Json.Net是一种很流行的方式。
这样做的好处还在于创建了一个 class,以后可以用于与对象关系映射器一起工作。
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.
}
对于纯文本文件,你是对的。
每个条目使用 1 行:
日期
细绳
整数
整数数组
如果您阅读代码中的文件,您可以通过逐行阅读轻松地将它们分开。
从数组中创建一个带有特定分隔符的字符串:
[1,2,3] -> “1,2,3”
当您阅读该行时,您可以用“,”拆分字符串并获得一个字符串数组。将每个Entry to int解析成一个等长的Int数组。
如何读写文件看一看Easiest way to read from and write to files
如果您真的想在某个时候切换到数据库,请尝试 JSON 文件格式。它很容易处理,并且有一些很好的插件可以使用。
制造商
海恩
我开始使用 C# 的方式是通过游戏 Space Steam 平台的工程师,Mods 需要在本地保存文件(%AppData%\Local\Temp\SpaceEngineers\
或 %AppData%\Roaming\SpaceEngineers\Storage\
) 用于各种设置,它们的日志记录类似于@H. Sandberg 提到(逐行,也许是稍后解析的分隔符),这样做的好处是它很容易检索,易于附加,易于覆盖,而且我很确定它甚至可以检索文件大小,这当与文件删除和文件创建结合使用时可以防止 运行 文件大小,因为这允许您设置一个上限来检查,允许您在服务器上 运行 它以最小的影响(可能最好包含一个最小日期过滤器{确保 X
至少存在 Y
天,然后将其删除超过 Z
字节},以防止调试数据丢失 {"Why was it over that limit?"})
就想法背后的实际代码而言,我的技能水平与 OP 大致相同,也就是说;菜鸟,但我建议查看 Space 工程师 Mod 中的一些示例的编码(而且对于 Beta 游戏来说还不错),因为它们几乎都是用 C# 编写的。此外,可编程块也在 C# 中编译,因此您将能够使用它来帮助学习 C# 并加强和利用您已经知道的内容(尽管出于安全原因不允许某些 C# 命令,利用 Mod API 你将有更多的灵活性来做一些事情,例如 Creating/Maintaining 日志文件,Retrieving/Modifying 对象属性等),你甚至可以将文本打印到各种格式游戏文本监视器。
如果我的语法需要改进,我深表歉意,很抱歉我目前无法编写一些代码来解决您的问题,但我知道
using System;
Console.WriteLine("Hello World");
所以至少它不是完全丢失,但我的示例代码可能无法编译,因为它可能缺少以下内容:输出位置,可能是一两个 API 引用,可能还有一些其他设置。就像我说的,我是新手,但这是一个有效的 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."
应该是结果。 ("Quotation Marks"不应该出现在读出{最后一个代码块}中,这只是为了提高可读性)
我需要指导,需要有人为我指明正确的方向。正如标题所说,我需要将信息保存到文件中:日期、字符串、整数和整数数组。而且我还需要能够在以后当用户想要查看它时访问该信息。 可选:文件是纯文本,我可以直接检查它,它是可以理解的。 如果选择的方法可以在将来 "easily" 转换为使用数据库而不是单个文件,则加分。
我是 C# 的新手,到目前为止我发现我应该将数组转换为带分隔符的字符串。
那么,你们有什么建议吗?
// 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);
}
第一个是可读的;第二个会更小。两者都可以很好地处理 "Date, string, integer and an array of integers" 或此类对象的数组。 Protobuf-net 需要添加一些属性来帮助它,但真的简单。
至于使用数据库 作为列 ...整数数组是那里的故障,因为大多数数据库不支持 "array of integers" 作为列类型。我会说 "separation of concerns" - 有一个单独的数据库持久性模型。如果您纯粹使用数据库来存储文档,那么:几乎每个数据库都支持 CLOB 和 BLOB 数据,因此两者都可用。许多数据库现在内置了 JSON 支持(辅助方法等),这可能会使 JSON 作为 CLOB 更具吸引力。
我可能会将其序列化为 json 并将其保存在某处。 Json.Net是一种很流行的方式。
这样做的好处还在于创建了一个 class,以后可以用于与对象关系映射器一起工作。
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.
}
对于纯文本文件,你是对的。 每个条目使用 1 行: 日期 细绳 整数 整数数组
如果您阅读代码中的文件,您可以通过逐行阅读轻松地将它们分开。
从数组中创建一个带有特定分隔符的字符串: [1,2,3] -> “1,2,3” 当您阅读该行时,您可以用“,”拆分字符串并获得一个字符串数组。将每个Entry to int解析成一个等长的Int数组。
如何读写文件看一看Easiest way to read from and write to files
如果您真的想在某个时候切换到数据库,请尝试 JSON 文件格式。它很容易处理,并且有一些很好的插件可以使用。
制造商 海恩
我开始使用 C# 的方式是通过游戏 Space Steam 平台的工程师,Mods 需要在本地保存文件(%AppData%\Local\Temp\SpaceEngineers\
或 %AppData%\Roaming\SpaceEngineers\Storage\
) 用于各种设置,它们的日志记录类似于@H. Sandberg 提到(逐行,也许是稍后解析的分隔符),这样做的好处是它很容易检索,易于附加,易于覆盖,而且我很确定它甚至可以检索文件大小,这当与文件删除和文件创建结合使用时可以防止 运行 文件大小,因为这允许您设置一个上限来检查,允许您在服务器上 运行 它以最小的影响(可能最好包含一个最小日期过滤器{确保 X
至少存在 Y
天,然后将其删除超过 Z
字节},以防止调试数据丢失 {"Why was it over that limit?"})
就想法背后的实际代码而言,我的技能水平与 OP 大致相同,也就是说;菜鸟,但我建议查看 Space 工程师 Mod 中的一些示例的编码(而且对于 Beta 游戏来说还不错),因为它们几乎都是用 C# 编写的。此外,可编程块也在 C# 中编译,因此您将能够使用它来帮助学习 C# 并加强和利用您已经知道的内容(尽管出于安全原因不允许某些 C# 命令,利用 Mod API 你将有更多的灵活性来做一些事情,例如 Creating/Maintaining 日志文件,Retrieving/Modifying 对象属性等),你甚至可以将文本打印到各种格式游戏文本监视器。
如果我的语法需要改进,我深表歉意,很抱歉我目前无法编写一些代码来解决您的问题,但我知道
using System;
Console.WriteLine("Hello World");
所以至少它不是完全丢失,但我的示例代码可能无法编译,因为它可能缺少以下内容:输出位置,可能是一两个 API 引用,可能还有一些其他设置。就像我说的,我是新手,但这是一个有效的 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."
应该是结果。 ("Quotation Marks"不应该出现在读出{最后一个代码块}中,这只是为了提高可读性)