2011-09-13 14 views
1

シリアライズ中に問題が発生しました& C#を使用したデシリアライズ。基本的に私はDataContractSerializerを使用してオブジェクトをシリアル化しています。これが正常に機能しているが、今、私は上記のシリアル化を解除する方法についてのヘルプが必要シリアライゼーションとデシリアライゼーションのC#

var serializer = new DataContractSerializer(typeof(ProjectSetup)); 
    string xmlString; 
    using (var sw = new StringWriter()) 
     { 
      using (var writer = new XmlTextWriter(sw)) 
       { 
        writer.Formatting = Formatting.Indented; 
        serializer.WriteObject(writer, DALProjectSetup); 
        writer.Flush(); 
        xmlString = sw.ToString(); 
       } 
      }     
     System.Web.HttpContext.Current.Session["ProjectSetup"] = xmlString; 

は、ここに私のシリアル化コードです。

+0

アニル、私のコードは、あなたが作業している場合答えとしてマークすることができます。それはいくつかの追加情報を提供していない場合。 –

+0

私は、このようにdeserializationのためにgoogleとコードを試しました:string toDeserialise = System.Web.HttpContext.Current.Session ["ProjectSetup"]。ToString(); DataContractSerializer dcs =新しいDataContractSerializer(typeof(ProjectSetup)); MemoryStream ms =新しいメモリストリーム(Encoding.UTF8.GetBytes(toDeserialise)); obj =(ProjectSetup)dcs.ReadObject(ms); – Anil

+0

とエラーが発生しました:型 'System.Collections.Hashtable'の取得専用コレクションがNULL値を返しました。入力ストリームには、インスタンスがnullの場合に追加できないコレクション項目が含まれています。コレクションの初期化は、オブジェクトのコンストラクタまたはゲッターで行うことを検討してください。 – Anil

答えて

1

私は次のことができると思っていますか?

string toDeserialise = yourValue; 
using(StringReader sr = new StringReader(toDeserialize)) 
using(XmlTextReader xmlReader = new XmlTextReader(sr)) 
{ 
    return (ProjectSetup)serializer.ReadObject(xmlReader); 
} 
+0

このエラーが発生しました: 'System.Collections.Hashtable'型のget-onlyコレクションがnull値を返しました。入力ストリームには、インスタンスがnullの場合に追加できないコレクション項目が含まれています。コレクションの初期化は、オブジェクトのコンストラクタまたはゲッターで行うことを検討してください。 – Anil

+0

@Anilは、 –

8

バレンタインの回答は、どのように脱直列化するかを示しています。あなたのコメントを再

i am getting this error: The get-only collection of type 'System.Collections.Hashtable' returned a null value. The input stream contains collection items which cannot be added if the instance is null.

(あまりにも、一般的に避けて価値があるだろうHashTableに注意してください)DataContractSerializerはコンストラクタを実行していないので、あなたが持っているので、もし、ある

private readonly HashTable myData = new HashTable(); 
[DataMember] 
public HashTable MyData { get { return myData; } } 

または:

private readonly HashTable myData; 
[DataMember] 
public HashTable MyData { get { return myData; } } 
public MyType() { 
    myData = new HashTable(); 
} 

myDataは、逆シリアル化の場合は常にnullになります。いくつかのアイデア:

まず、プライベートセットを追加してみてください。例えば:

[OnDeserializing] 
void OnSerializing(StreamingContext ctx) { 
    myData = new HashTable(); 
} 
private HashTable myData = new HashTable(); 
[DataMember] 
public HashTable MyData { get { return myData; } } 

または::

[DataMember] 
public HashTable MyData { get; private set; } 
public MyType() { 
    MyData = new HashTable(); 
} 

そうしないと、前のデシリアライズのコールバックを使用することができますプロパティは、よりインテリジェントにする:

private HashTable myData; 
[DataMember] 
public HashTable MyData { get { return myData ?? (myData = new HashTable()); } } 
関連する問題