2009-11-17 35 views
23

Tôi muốn tạo một chuỗi nhị phân của một đối tượng và kết quả để lưu nó vào cơ sở dữ liệu.C# Object Binary Serialization

Person person = new Person(); 
person.Name = "something"; 

MemoryStream memorystream = new MemoryStream(); 
BinaryFormatter bf = new BinaryFormatter(); 
bf.Serialize(memorystream, person); 

Làm cách nào để chuyển đổi bộ nhớ trong loại chuỗi được lưu trong cơ sở dữ liệu và sau này để có thể deserialize đối tượng?

Trả lời

48

Điều bạn đang thực sự yêu cầu là cách an toàn để thể hiện dữ liệu nhị phân tùy ý dưới dạng văn bản và sau đó chuyển đổi lại. Thực tế là nó lưu trữ một đối tượng được tuần tự hóa là không liên quan.

Câu trả lời gần như là sử dụng Cơ sở 64 (ví dụ: Convert.ToBase64StringConvert.FromBase64String). Làm không phải sử dụng Encoding.UTF8.GetString hoặc bất kỳ thứ gì tương tự - dữ liệu nhị phân của bạn là không phải là dữ liệu văn bản được mã hóa và không được xử lý như vậy.

Tuy nhiên, cơ sở dữ liệu của bạn không có loại dữ liệu cho dữ liệu nhị phân phải không? Check for BLOB, IMAGE và các loại Binary ...

+0

byte thành chuỗi --- cần một số Mã hóa. – loneshark99

+0

@ loneshark99: Tôi không hiểu bình luận của bạn chút nào. Nếu đây là dữ liệu nhị phân tùy ý - chứ không phải là văn bản được mã hóa - thì sử dụng 'Mã hóa' sẽ chính xác là phương pháp * sai *. –

+0

Tôi đang học, nhưng tôi tự hỏi tại sao Mã hóa không phải là cách tiếp cận đúng và ToBase64String là. – loneshark99

8

tôi đã sử dụng một cái gì đó như thế này

MemoryStream memoryStream = new MemoryStream(); 
BinaryFormatter binaryFormatter = new BinaryFormatter(); 
binaryFormatter.Serialize(memoryStream, Person); 
memoryStream.Flush(); 
memoryStream.Position = 0; 
string value = Convert.ToBase64String(memoryStream.ToArray()); 
+8

Bạn không cần phải tua lại MemoryStream trước khi gọi ToArray - nó trả về toàn bộ dữ liệu của luồng bất kể vị trí hiện tại. Tương tự như vậy Flush không làm bất cứ điều gì trên một MemoryStream, mặc dù đó là một ý tưởng tốt cho các luồng nói chung. –

+0

Thanx để được tư vấn. –

2

Về cơ bản, không lưu dữ liệu như chuỗi cơ sở dữ liệu, có blob trường có sẵn để lưu trữ Dữ liệu nhị phân.

Nếu bạn thực sự cần dữ liệu dưới dạng chuỗi, bạn cần chuyển byte [] thành chuỗi bằng mã hóa base64 và lấy byte [] từ giải mã sử dụng chuỗi.

0

Bạn chưa xem xét chuyển đổi bộ nhớ thành chuỗi base64hex để được đưa vào cơ sở dữ liệu chưa?

byte[] mStream = memorystream.ToArray(); 
string sConvertdHex = System.Convert.ToBase64String(mStream) 

Sau đó, bạn có thể đổ nội dung sConvertdHex vào cơ sở dữ liệu. Để deserialize nó, bạn cần phải làm ngược lại

byte[] mData = System.Convert.FromBase64String(...) 

sau đó deserialize mData trở lại đối tượng của bạn.

32

Đây là mẫu. TData phải được đánh dấu [Serializable] và tất cả các loại trường cũng có.

private static TData DeserializeFromString<TData>(string settings) 
    { 
     byte[] b = Convert.FromBase64String(settings); 
     using (var stream = new MemoryStream(b)) 
     { 
      var formatter = new BinaryFormatter(); 
      stream.Seek(0, SeekOrigin.Begin); 
      return (TData)formatter.Deserialize(stream); 
     } 
    } 

    private static string SerializeToString<TData>(TData settings) 
    { 
     using (var stream = new MemoryStream()) 
     { 
      var formatter = new BinaryFormatter(); 
      formatter.Serialize(stream, settings); 
      stream.Flush(); 
      stream.Position = 0; 
      return Convert.ToBase64String(stream.ToArray()); 
     } 
    } 
16
 //-------write to database------------------------- 
     Person person = new Person(); 
     person.name = "Firstnm Lastnm"; 
     MemoryStream memorystream = new MemoryStream(); 
     BinaryFormatter bf = new BinaryFormatter(); 
     bf.Serialize(memorystream, person); 
     byte[] yourBytesToDb = memorystream.ToArray(); 
     //here you write yourBytesToDb to database 


     //----------read from database--------------------- 
     //here you read from database binary data into yourBytesFromDb 
     MemoryStream memorystreamd = new MemoryStream(yourBytesFromDb); 
     BinaryFormatter bfd = new BinaryFormatter(); 
     Person deserializedperson = bfd.Deserialize(memorystreamd) as Person; 
+1

Nên có 'sử dụng' quanh' MemoryStream' – j00hi