我可以使用C#中的filestream将类的obj发送到文件吗?

我可以使用C#中的filestream将类的obj发送到文件吗?,c#,io,filestream,C#,Io,Filestream,我想知道我是否可以发送一个包含4名成员的完整obj: string name string lastname int StudentID int CitizenID 是否使用filestream命令以二进制格式保存为.txt文件 我知道序列化,它很容易将obj发送到.xml文件,但当我让我的程序使用它并向老师展示时,他说他不想让我使用它,说我必须使用基本的filestream命令,如fstream,instream,outtream,以及。。。在C++中,他告诉我他想要一个二进制格式保存的.t

我想知道我是否可以发送一个包含4名成员的完整obj:

string name
string lastname
int StudentID
int CitizenID
是否使用filestream命令以二进制格式保存为.txt文件

我知道序列化,它很容易将obj发送到.xml文件,但当我让我的程序使用它并向老师展示时,他说他不想让我使用它,说我必须使用基本的filestream命令,如
fstream
instream
outtream
,以及。。。在C++中,他告诉我他想要一个二进制格式保存的.txt文件.< /p> 现在我的问题是,我可以将整个obj发送到C#中的.txt文件中吗?还是必须像字符串一样发送它,这将是相当多的工作

因为我必须将所有成员都转换为字符串,然后在每个成员的末尾放置一个指示符或其他东西,以便我以后可以读取它们并将它们分开

现在我的问题是,我可以将整个obj发送到C#中的.txt文件中吗?还是必须像字符串一样发送它。。。这将是相当多的工作

是的,它有一个名称:序列化。无论您是在自己的代码中手动执行,还是使用一系列现有序列化库中的一个,这都是序列化。如果您的老师不希望您使用序列化库,那么您必须在自己的代码中使用它。这真是愚蠢。我想知道老师是否希望你也在硬盘上写原始命令,以避免所有那些愚蠢的抽象,比如HAL、OS或公共类库

也许有必要向你的老师澄清什么是可以接受的,什么是不可以接受的。例如,一个二进制序列化程序就足够了吗?我能说出几个。使用
BinaryWriter
/
BinaryReader
可以吗?或者,练习的目的是让您思考序列化/反序列化需要做什么?如果是后者:那么是的,了解流、编码和帧协议(哨兵值与长度前缀数据等)。

我会使用这个

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

这允许您将对象和文件路径传递给方法,以将传递的对象序列化为传递的文件路径

当然,这将不允许您读取.txt文件的内容。看起来像是胡言乱语。如果您的目的是将数据写入人类可读的文件,那么,有很多这样的例子:p我只是提供了序列化的东西,因为我花了一段时间才弄明白

编辑:拍摄。我忘了一些密码

using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
代码需要这些才能工作(对于IFormatter),同样,为了让流工作,您需要使用

using System.IO;
对不起,忘了

编辑2:忘了提及,您需要在希望以这种方式序列化的对象上使用[Serializeable]标记。只需将“[Serializeable]”放在要序列化的类的顶部

[Serializeable]
class SerializeableObject
{
    string aString;

    void aMethod()
    {
    }
}

<>他想把它用C++做,而不是C?这是需要澄清的重要的第一部分。你的问题被标记为C#,你问你是否可以用C#将一个对象发送到一个文本文件中,但是如果你的老师只会说“不,我告诉过你用C++来做”,你在这里得到什么帮助?请澄清:在C++或C++中需要这样做吗?我怀疑保存到二进制格式的有效性,并追加一个.txt文件扩展名。如果使用二进制序列化机制,您将无法打开文件并在记事本中正确读取它。所有文件都是二进制文件,它们由字节组成。具有.TXT扩展名是一个信号,它告诉程序这个由字节组成的文件可以以某种方式解释为由字符组成的文本。但只是附加。txt不使它成为文本或可读的。@ Lasev.Kalsern,嘿,他不想在C++中,他说在你想去的地方做它,但是他是我们班前的C++老师,所以他告诉我我要你使用FSRATH流之外,这样你就用C++或在C语言中为UR程序均衡了。并使binary.txt文件不可用。xml@LasseV.Karlsen是的,我知道我不能用记事本之类的东西打开它,但我应该可以用我的程序再次打开它,这样我就可以搜索记录,并在需要时编辑或删除它们。@Pedram注意:在文件内部编辑和删除(不必重新写入整个文件)并不像你想象的那么简单,如果这是一个实际的需求,你需要为此设计它。例如,固定长度记录或填充,可能还有逻辑删除标志。或者逻辑删除(设置一位)并附加到文件末尾等等。是的,我知道序列化,我想我的老师想要.txt二进制文件,他对它很冷静,直到他认为它生成.xml文件,他告诉我制作一个二进制.txt文件以保存我的studentrecords,整个问题是制作一个记录学生记录的程序,然后把它保存到一个文件中,然后搜索、编辑、删除,当我问他如何将它们分开时,他说,制作一个字符串并将其打印为每条记录的最后一行,这样你就知道它结束了,新记录开始了,比如双00或什么,“我的老师想要.txt二进制文件”-基本上,允许我重复Lasse已经说过的一切;光是那句话就让我畏缩。但事实上,如果你想学习如何将数据写入文件,那就去做吧。顺便说一句,我不知道这门课的英文名称,但如果你逐字翻译,它将是:数据的存储和检索LOL我的意思是我的老师想要一个以二进制格式写入数据的something.txt文件,在C++中,你会添加一些类似于iOS:二进制或者在它的末尾的东西,它会保存为二进制!@佩德兰:不,除非你在协议中有规定。文件位置只是一个偏移量。例如,考虑CD。“移动到第9轨道”是什么意思?它之所以有意义,是因为有一些索引数据可以定义
[Serializeable]
class SerializeableObject
{
    string aString;

    void aMethod()
    {
    }
}