2014-05-09 3 views
1

내 프로그램의 아이디어는 사용자가 자신의 데이터를 클라우드에 저장할 수있게하는 것입니다. 데이터는 이진 직렬화 파일에 저장됩니다.이진 직렬화 된 파일 업로드 문제

직렬화 코드 그래서 다음과 같습니다

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(); 

파일 인코딩 변경 (나는 확실하지 않다 그 .. 인코딩 문제가 있지만 그렇게 생각한다면) 더 이상 파일을 deserialize 수없는, 예외가 발생합니다. 파일을 손상시키지 않는 방법에 대해 알고 있습니까?

최고 감사합니다.

+0

자세한 내용이 필요합니다. 우리에게 예외를 보여주십시오. –

+0

이것은 귀하의 질문에 직각이지만, ** 당신은 정말 BinaryFormatter **를 사용하고 싶지 않습니다. 일단 클라이언트를 업그레이드하면 많은 문제가 생길 것입니다. XML이나 Json과 같은 다른 유형의 직렬화 형식을 조사해야합니다. BinaryFormatter는 시스템의 다른 모듈 간 전송 형식으로, 시스템의 한 부분을 업그레이드 할 수있는 저장 형식이 아닙니다. –

+0

Lasse가 말한 것을 계속하려면 ... 또는 proto-buf.net과 같이 어셈블리 버전에 묶이지 않은 바이너리 형식을 사용하십시오. –

답변

1

인코딩은 텍스트에만 적용되며 여기서 이진 파일을 다루고 있습니다. 문자열로 읽지 마십시오. 운영 체제의 현재 구성에 따라 Encoding.Default을 사용하기 때문에 "인코딩이 변경되었습니다". 당신이 메모리에 전체 이진 파일을 읽어들이는 경우

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

:

는 그냥 코드를 변경합니다.