我的程序的想法是允许用户将他的数据保存在云中。数据存储在二进制序列化文件中。
序列化代码如下所示:
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();
文件编码发生了变化(我不确定..如果编码是问题,但我认为是这样)并且我无法反序列化该文件,异常发生。你知道怎么不破坏文件吗?
最诚挚的问候!
答案 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();
如果你想在内存中读取整个二进制文件。