2013-02-28 3 views
0

У меня есть класс, чтобы провести некоторые детали для консультанта:Win RT Deserialize XML в объект

namespace MortgageApp_2 
{ 
[KnownType(typeof(MortgageApp_2.AdviserDetails))] 
[DataContractAttribute] 
public class AdviserDetails 
{ 
    [DataMember()] 
    public string Consultant { get; set; } 

    [DataMember()] 
    public string Company { get; set; } 

    [DataMember()] 
    public string AddressOne { get; set; } 

    [DataMember()] 
    public string AddressTwo { get; set; } 

    [DataMember()] 
    public string City { get; set; } 

    [DataMember()] 
    public string County { get; set; } 

    [DataMember()] 
    public string Postcode { get; set; } 

    [DataMember()] 
    public string Telephone { get; set; } 

} 
} 

Следующий код стерилизует AdviserDetails в XML:

  StorageFolder folder = ApplicationData.Current.LocalFolder; 
     string fileName = "AdviserDetails.xml"; 
     CreationCollisionOption options = CreationCollisionOption.ReplaceExisting; 

     try 
     { 
      var file = await folder.CreateFileAsync(fileName, options); 

      using (var stream = await file.OpenStreamForWriteAsync()) 
      { 
       var ser = new DataContractSerializer(typeof(AdviserDetails)); 
       ser.WriteObject(stream, adDetails); 
      } 
     } 
     catch (Exception ex) 
     { 
      System.Diagnostics.Debug.WriteLine(ex.ToString()); 

      if (Debugger.IsAttached) 
       Debugger.Break(); 

      throw; 
     } 

Созданный файл XML выглядит следующим образом:

<AdviserDetails xmlns="http://schemas.datacontract.org/2004/07/MortgageApp_2" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><AddressOne>242 Office Block</AddressOne><AddressTwo>32 Hill Street</AddressTwo><City>Birmingham</City><Company>Best Mortgages</Company><Consultant>Bill Jones</Consultant><County>West Midlands</County><Postcode>B1 1AB</Postcode><Telephone>05100021300</Telephone></AdviserDetails> 

следующий код используется для десериализации XML для объекта типа AdviserDeta ILS:

StorageFolder folder = ApplicationData.Current.LocalFolder; 
     string fileName = "AdviserDetails.xml"; 
     string location = folder.Path + "\\" + fileName; 
     var file = await StorageFile.GetFileFromPathAsync(location).AsTask().ConfigureAwait(false); 
     var stream = await file.OpenStreamForReadAsync().ConfigureAwait(false); 

     var serializer = new XmlSerializer(typeof(AdviserDetails)); 
     var loadAdviser = (AdviserDetails)serializer.Deserialize(stream.AsInputStream().AsStreamForRead()); 

Однако, последняя строка:

var loadAdviser = (AdviserDetails)serializer.Deserialize(stream.AsInputStream().AsStreamForRead()); 

Выдает исключение:

Существует ошибка в документе XML (1, 2).

Кто-нибудь знает, что не так, и как я могу получить свое приложение для создания файла XMl, который он может читать?

Спасибо! :)

ответ

1

Попробуйте так:

Serializer:

static async private Task SaveAsync<T>() 
    { 
     StorageFile sessionFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting); 
     IRandomAccessStream sessionRandomAccess = await sessionFile.OpenAsync(FileAccessMode.ReadWrite); 
     IOutputStream sessionOutputStream = sessionRandomAccess.GetOutputStreamAt(0); 
     var sessionSerializer = new DataContractSerializer(typeof(List<object>), new Type[] { typeof(T) }); 
     sessionSerializer.WriteObject(sessionOutputStream.AsStreamForWrite(), _data); 
     await sessionOutputStream.FlushAsync(); 
    } 

десериализатор:

static async private Task RestoreAsync<T>() 
    { 
     StorageFile sessionFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.OpenIfExists); 
     if (sessionFile == null) 
     { 
      return; 
     } 
     IInputStream sessionInputStream = await sessionFile.OpenReadAsync(); 
     var sessionSerializer = new DataContractSerializer(typeof(List<object>), new Type[] { typeof(T) }); 
     _data = (List<object>)sessionSerializer.ReadObject(sessionInputStream.AsStreamForRead()); 
    } 

Рабочий пример: Here

+1

Понял работает, в конце концов, спасибо вы очень за ссылку. :) Реализация XML-материала в Win RT - настоящая миссия! – Cheese1223

Смежные вопросы