上传二进制序列化文件时出现问题

时间:2014-05-09 21:39:27

标签: c# serialization encoding ftp

我的程序的想法是允许用户将他的数据保存在云中。数据存储在二进制序列化文件中。

序列化代码如下所示:

FileStream Stream = new FileStream(..., FileMode.Create); // create stream
BinaryFormatter Formatter = new BinaryFormatter(); // create formatter
Formatter.Serialize(Stream, ObjectToSerialize); // serialize
Stream.Close();

问题是当我上传序列化文件时,使用以下代码:

FtpWebRequest Request = (FtpWebRequest)WebRequest.Create(new Uri(...));
Request.Method = WebRequestMethods.Ftp.UploadFile;

Request.Credentials = new NetworkCredential(..., ...);
string Path = System.IO.Path.GetDirectoryName(...;
StreamReader SourceStream = new StreamReader(Path);
Request.UseBinary = true;
byte[] FileContents = Encoding.Default.GetBytes(SourceStream.ReadToEnd());
SourceStream.Close();
Request.ContentLength = FileContents.Length;

Stream RequestStream = Request.GetRequestStream();
RequestStream.Write(FileContents, 0, FileContents.Length);
RequestStream.Close();

FtpWebResponse Response = (FtpWebResponse)Request.GetResponse();

Response.Close(); 

文件编码发生了变化(我不确定..如果编码是问题,但我认为是这样)并且我无法反序列化该文件,异常发生。你知道怎么不破坏文件吗?

最诚挚的问候!

1 个答案:

答案 0 :(得分:1)

编码仅适用于文本,您在这里处理二进制文件。您不应该尝试将其作为字符串读取。 “编码已更改”,因为您使用的Encoding.Default取决于操作系统的当前配置。

只需将代码更改为:

string Path = System.IO.Path.GetDirectoryName(...);
// StreamReader SourceStream = new StreamReader(Path);
// Request.UseBinary = true;
byte[] FileContents = File.ReadAllBytes(Path);
// SourceStream.Close();

如果你想在内存中读取整个二进制文件。