2012-04-30 16 views
30

メモリストリームを使用してシリアル化に問題があります。ここに私のコードは次のとおりです。メモリストリームでシリアライズ/デシリアライズ

/// <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; 
} 

私は取得していますエラーは以下の通りです: ストリームは有効なバイナリフォーマットではありません。 blah ....

エラーの原因は正確にはわかりません。どんな助けでも大歓迎です。コールの

例:

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

MemoryStream stream = SerializeToStream(myDog) 

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

メソッドの呼び出しに使用しているコードを入力します。 – Fernando

+0

このコードの使い方を教えてください。このパラメータの名前がobjectType –

+1

であることは疑わしいです。あなたのコードの例を実行することによって問題はありません。あなたはストリームオブジェクトを扱う他の部分を持っていますか? – Turbot

答えて

38

は、このコードは私の作品:

タイプはこのようなものです
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()); 
} 

[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); 
    } 
} 

とユーティリティメソッドは次のとおりです。

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

私はあなたが今提案したコードを実装し、この例外をスローします: 呼び出しのターゲットによって例外がスローされました。 これは行内に発生します オブジェクトo = formatter.Deserialize(ストリーム); 私は間違って何をしていますか? – MeM

+0

大丈夫私はデシリアライゼーションコンストラクタでひどい間違いを犯しました。私のプロパティの情報の1つが間違っていました(つまり、... = info.GetValue( "HereWasWrong_ItWasNonExistingThing"、typeof(int));) ここはこの仕事の良いリンクです。 /www.codeproject.com/Articles/1789/Object-Serialization-using-C Cheesoのおかげで、答えは良いです。 – MeM

1

BinaryFormatterは、特定の場合に無効な出力を生成することがあります。例えば、対になっていないサロゲート文字は省略されます。また、インタフェースタイプの値に問題があるかもしれません。コミュニティコンテンツを含むdocumentation pageをお読みください。

エラーが永続的である場合は、DataContractSerializerまたはXmlSerializerのようなXMLシリアライザの使用を検討してください。

関連する問題