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 回答