0

アドバイザーのためにいくつかの詳細を保持するクラスがあります:

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をAdviserDetailsタイプのオブジェクトに逆シリアル化します。

  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ファイルを作成させる方法を知っている人はいますか?

ありがとう!:)

4

1 に答える 1

1

このようにしてみてください:

シリアライザー:

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

実例:ここ

于 2013-02-28T18:05:42.613 に答える