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

时间:2014-04-15 08:33:40

标签: c# io filestream

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

string name
string lastname
int StudentID
int CitizenID

使用文件流赞成以二进制格式保存在.txt文件中?

我知道序列化,它很容易将一个obj发送到.xml文件,但是当我使用它并向我的老师展示我的程序时,他说他不想让我使用它,我说必须在C ++中使用基本文件流命令,如fstreaminstreamoutstream和...,并告诉我他想要一个二进制格式保存的.txt文件。

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

因为我必须将所有成员变成字符串,然后在每个成员的末尾添加一个指示符或某些内容,以便稍后我可以从中读取并将它们分开。

2 个答案:

答案 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()
    {
    }
}

喜欢这样。