我可以使用C#中的文件流将类的obj发送到文件中吗
本文关键字:文件 obj 可以使 我可以 | 更新日期: 2023-09-27 17:58:33
我想知道是否可以发送一个包含4个成员的完整obj:
string name
string lastname
int StudentID
int CitizenID
使用filestream命令以二进制格式保存在.txt文件中?
我知道序列化,它很容易将obj发送到.xml文件,但当我使用它制作程序并将其展示给老师时,他说他不希望我使用它,说我必须使用基本文件流命令,如fstream
、instream
、outstream
和。。。在C++中,并告诉我他想要一个二进制格式保存的.txt文件。
现在我的问题是,我可以把一个完整的obj发送到C#中的.txt文件吗?还是必须像字符串一样发送它,这将是一项相当艰巨的工作。
因为我必须将所有成员转换为字符串,然后在每个成员的末尾放一个指示符或其他东西,这样我以后就可以读取它们并将它们分离。
现在我的问题是,我可以把一个完整的obj发送到C#中的.txt文件吗?还是必须像字符串一样发送它。。。这将是相当多的工作,
是的,这有一个名称:序列化。无论是在自己的代码中手动执行,还是使用一系列现有序列化库中的一个,都是序列化。如果你的老师不希望你使用序列化库,那么你就必须在自己的代码中使用它。坦率地说,这是愚蠢的。我想知道老师是否也希望你在硬盘上写原始命令,以避免所有愚蠢的抽象,比如HAL、OS或公共类库。。。
也许值得向你的老师澄清什么是可以接受的,什么是不可以接受的。例如,二进制序列化程序就足够了吗?我能说出几个。使用BinaryWriter
/BinaryReader
可以吗?还是练习的目的是让您思考序列化/反序列化需要做什么?如果是后者:那么是的,了解流、编码和成帧协议(sentinel值与带长度前缀的数据等)。
我会用这个。。。
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:忘了提一下,您需要在希望以这种方式序列化的对象上使用[Serializable]标记。只需将"[Serializable]"放在要序列化的类的顶部即可。
[Serializeable]
class SerializeableObject
{
string aString;
void aMethod()
{
}
}
像这样。