我想知道我是否可以发送一个包含4名成员的整个obj:
string name
string lastname
int StudentID
int CitizenID
使用文件流赞成以二进制格式保存在.txt文件中?
我知道序列化,它很容易将一个obj发送到.xml文件,但是当我使用它并向我的老师展示我的程序时,他说他不想让我使用它,我说必须在C ++中使用基本文件流命令,如fstream
,instream
,outstream
和...,并告诉我他想要一个二进制格式保存的.txt文件。
现在我的问题是,我可以将整个obj发送到C#中的.txt文件,还是必须像字符串一样发送它,这将是非常多的工作。
因为我必须将所有成员变成字符串,然后在每个成员的末尾添加一个指示符或某些内容,以便稍后我可以从中读取并将它们分开。
答案 0 :(得分:1)
现在我的问题是,我可以将整个obj发送到C#中的.txt文件,还是我必须像字符串一样发送它...这将是相当多的工作,
是的,有一个名称:序列化。无论是在自己的代码中手动执行,还是使用一系列现有的序列化库,都是序列化。如果您的老师不希望您使用序列化库,那么您必须在自己的代码中执行此操作。坦率地说这是愚蠢的。我想知道老师是否也希望你将原始命令写入硬盘,以避免所有那些愚蠢的抽象,如HAL,OS或公共类库...
可能值得向您的老师澄清什么是可接受的,哪些是不可接受的。例如,二进制序列化器是否足够?我可以说几个。可以使用BinaryWriter
/ BinaryReader
吗?或者练习的目的是让您考虑您需要做什么来序列化/反序列化?如果是后者:那么是,了解流,编码和成帧协议(前哨值与长度前缀数据等)。
答案 1 :(得分:1)
我用这个......
void saveInBinary()
{
IFormatter binaryFormatter = new BinaryFormatter();
Stream binaryStream = new FileStream("File Path Here", FileMode.Create, FileAccess.Write, FileShare.None);
binaryFormatter.Serialize(binaryStream, this);
binaryStream.Close();
}
将其粘贴在对象的成员空间中,然后调用它。
或者,更有用的东西......
void saveInBinary(object o)
{
IFormatter binaryFormatter = new BinaryFormatter();
Stream binaryStream = new FileStream("File Path Here", FileMode.Create, FileAccess.Write, FileShare.None);
binaryFormatter.Serialize(binaryStream, o);
binaryStream.Close();
}
这将序列化传递给它的任何对象。
最后的变化(我保证!):p
void saveInBinary(object o, string filePath)
{
IFormatter binaryFormatter = new BinaryFormatter();
Stream binaryStream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None);
binaryFormatter.Serialize(binaryStream, o);
binaryStream.Close();
}
这个允许您将对象和文件路径传递给方法,以将传递的对象序列化为传递的文件路径。
当然,这不允许您阅读.txt文件的内容。它看起来像个笨蛋。如果您的目的是将数据写入人类可读文件,那么有很多例子。 :p我刚刚提供了序列化的东西,因为我需要一段时间来弄清楚它。 ;)
编辑:拍摄。我忘了一些代码......
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
代码需要那些工作(对于IFormatter)另外,要使Stream工作,你需要使用
using System.IO;
抱歉忘了。
编辑2:忘记提及,您需要在希望以这种方式序列化的对象上使用[Serializableable]标记。只需输入" [Serializableable]"在您要序列化的课程之上。
[Serializeable]
class SerializeableObject
{
string aString;
void aMethod()
{
}
}
喜欢这样。