2011-10-20 29 views
2

DataContractSerializerを使用して複数のオブジェクトをシリアル化および逆シリアル化するにはどうすればよいですか? シリアライズは正常ですが、デシリアライズ中にエラーが発生しますDataContractSerializerを使用して複数のオブジェクトをシリアル化および逆シリアル化する

"シリアル化操作が失敗しました。理由:Serialization.Person型のオブジェクトを逆シリアル化する際にエラーが発生しました。

エラーメッセージに、シリアル化されたドキュメントにルート要素がないことが明確に記載されています。 しかし、これをどのように克服するのですか?

は、ここでは、コードです:

[DataContract] 
class Person { 
    [DataMember(Name = "CustName")] 
    internal string Name; 
    public Person(string n) {Name = n;} 
} 

class Program { 
    public static void Main() { 
      WriteObject("d:\\temp\\DataContractExample.xml" , "Mary"); 
      WriteObject("d:\\temp\\DataContractExample.xml", "Joe"); 
      ReadObject("d:\\temp\\DataContractExample.xml"); 
    } 

    public static void WriteObject(string path, string name) { 
     Person p1 = new Person(name); 
     FileStream fs = new FileStream(path, FileMode.Append); 
     XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(fs); 
     DataContractSerializer ser = new DataContractSerializer(typeof(Person)); 
     ser.WriteObject(writer, p1); 

     writer.Close(); 
     fs.Close(); 
    } 
    public static void ReadObject(string path) { 
     FileStream fs = new FileStream(path, FileMode.OpenOrCreate); 
     XmlDictionaryReader reader = 
      XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas()); 

     DataContractSerializer ser = new DataContractSerializer(typeof(Person)); 

     // Deserialize the data and read it from the instance. 
     Person[] newPerson = (Person[])ser.ReadObject(reader); 
     Console.WriteLine("Reading this object:"); 
     Console.WriteLine(String.Format("{0}", newPerson[0].Name)); 
     fs.Close(); 
    } 

は私がDataContractSerializer、ser.ReadObject(読者)から読み込まれ、私は、私は上記の例外を取得します。 DataContractSerializerを使用して複数のオブジェクトを格納しながらルート要素を作成することはできますか?

+0

ただし、保存形式を変更できる場合は、いくつかの形式が安全に追加可能であることに注意してください。もしあなたが別のデータ形式を使って同様の例に興味を持っているのであれば教えてください。(どちらがうまくいくのですか) –

+0

注意 - あなたは2つの 'Person'インスタンスを(別々に)書き、' Person [] ' - しかしそれは非常に異なるレイアウトを持っています –

+0

はいマーク!あなたが話しているその他のストレージ形式は何ですか?どんなポインタも私を助けます。私は、ワークフロー階層のためのストレージソリューションを作成しています。だから私は動的に要素を追加、変更、削除する必要があります。 – Santhosh

答えて

3

DataContractSerializerはxmlドキュメントで動作しますので、トップレベルの要素が1つ必要です。最も簡単な方法は、List<Person>をシリアル化することです。これはこれを避けるべきです。また、おそらくXmlReaderReadSubtreeを使用して、外部要素を手動で追加することもできます(ただし、これは厄介な作業です)。

最も簡単なオプションは、しかし、単に最初からList<Person>をシリアル化し、List<Person>としてデシリアライズすることです - これは、単一のXML塊となりますので、デシリアライザを混乱はありません。

関連する問題