2012-04-30 28 views
30

Tôi đang gặp sự cố với việc tuần tự hóa bằng cách sử dụng luồng bộ nhớ. Đây là mã của tôi:Serializing/deserializing với luồng bộ nhớ

/// <summary> 
/// serializes the given object into memory stream 
/// </summary> 
/// <param name="objectType">the object to be serialized</param> 
/// <returns>The serialized object as memory stream</returns> 
public static MemoryStream SerializeToStream(object objectType) 
{ 
    MemoryStream stream = new MemoryStream(); 
    IFormatter formatter = new BinaryFormatter(); 
    formatter.Serialize(stream, objectType); 
    return stream; 
} 

/// <summary> 
/// deserializes as an object 
/// </summary> 
/// <param name="stream">the stream to deserialize</param> 
/// <returns>the deserialized object</returns> 
public static object DeserializeFromStream(MemoryStream stream) 
{ 
    IFormatter formatter = new BinaryFormatter(); 
    stream.Seek(0, SeekOrigin.Begin); 
    object objectType = formatter.Deserialize(stream); 
    return objectType; 
} 

Lỗi tôi nhận được như sau: luồng không phải là định dạng nhị phân hợp lệ. Nội dung bắt đầu (tính theo byte) là: blah ....

Tôi không chắc chắn nguyên nhân gây ra lỗi. Mọi sự trợ giúp sẽ rất được trân trọng.

Ví dụ về các cuộc gọi:

Dog myDog = new Dog(); 
myDog.Name= "Foo"; 
myDog.Color = DogColor.Brown; 

MemoryStream stream = SerializeToStream(myDog) 

Dog newDog = (Dog)DeserializeFromStream(stream); 
+0

Cung cấp mã bạn đang sử dụng để gọi phương thức của mình. – Fernando

+0

bạn có thể chỉ cho chúng tôi cách bạn sử dụng mã này không? Thật đáng ngờ rằng tham số này được đặt tên objectType –

+1

Tôi không gặp bất kỳ vấn đề nào khi thực thi ví dụ về mã của bạn. Bạn có phần khác xử lý đối tượng luồng không? – Turbot

Trả lời

38

Mã này làm việc cho tôi:

public void Run() 
{ 
    Dog myDog = new Dog(); 
    myDog.Name= "Foo"; 
    myDog.Color = DogColor.Brown; 

    System.Console.WriteLine("{0}", myDog.ToString()); 

    MemoryStream stream = SerializeToStream(myDog); 

    Dog newDog = (Dog)DeserializeFromStream(stream); 

    System.Console.WriteLine("{0}", newDog.ToString()); 
} 

Trường hợp loại là như thế này:

[Serializable] 
public enum DogColor 
{ 
    Brown, 
    Black, 
    Mottled 
} 

[Serializable] 
public class Dog 
{ 
    public String Name 
    { 
     get; set; 
    } 

    public DogColor Color 
    { 
     get;set; 
    } 

    public override String ToString() 
    { 
     return String.Format("Dog: {0}/{1}", Name, Color); 
    } 
} 

và phương pháp hữu ích là:

public static MemoryStream SerializeToStream(object o) 
    { 
     MemoryStream stream = new MemoryStream(); 
     IFormatter formatter = new BinaryFormatter(); 
     formatter.Serialize(stream, o); 
     return stream; 
    } 

    public static object DeserializeFromStream(MemoryStream stream) 
    { 
     IFormatter formatter = new BinaryFormatter(); 
     stream.Seek(0, SeekOrigin.Begin); 
     object o = formatter.Deserialize(stream); 
     return o; 
    } 
+0

Tôi triển khai mã mà bạn đã đề xuất ngay bây giờ và mã ném ngoại lệ này: Ngoại lệ đã bị ném bởi mục tiêu yêu cầu. Nó xảy ra trong dòng đối tượng o = formatter.Deserialize (stream); Tôi đang làm gì sai? – MeM

+0

okay Tôi đã thực hiện một sai lầm khủng khiếp trong constructor Deserialization. Một trong những thông tin thuộc tính của tôi là sai (tức là ... = info.GetValue ("HereWasWrong_ItWasNonExistingThing", typeof (int));) ở đây nó là một liên kết tốt cho công việc này, và ai đó có thể cần nó: http://www.codeproject.com/Articles/1789/Object-Serialization-using-C cũng nhờ Cheeso, câu trả lời là tốt. – MeM

1

BinaryFormatter có thể tạo ra kết quả không hợp lệ trong một số trường hợp cụ thể. Ví dụ, nó sẽ bỏ qua các ký tự đại diện chưa được ghép nối. Nó cũng có thể có vấn đề với các giá trị của các loại giao diện. Đọc số documentation page này bao gồm nội dung cộng đồng.

Nếu bạn thấy lỗi của mình liên tục, bạn có thể muốn xem xét sử dụng trình nối tiếp XML như DataContractSerializer hoặc XmlSerializer.

Các vấn đề liên quan