C#异步序列化

时间:2013-06-17 07:44:23

标签: c# windows-8 microsoft-metro

有没有办法异步序列化类? 当我的程序尝试这样做时,我会问:

public static async void Serialize(List<Zajecia> xml_List)
    {
        using (var stream = await ApplicationData.Current.LocalFolder.OpenStreamForWriteAsync("Plan list.xml", CreationCollisionOption.ReplaceExisting))
        {
            XmlSerializer serializer = new XmlSerializer(typeof(List<Zajecia>));
            using (XmlWriter xmlWriter = XmlWriter.Create(stream, new XmlWriterSettings() { Indent = true }))
            {
                serializer.Serialize(xmlWriter, xml_List);
            }
        }

    }

类别:

public class Zajecia
    {
        public string c { get; set; }
        public string p { get; set; }

        public Zajecia ()
        {}
        public Zajecia(string C, string P)
        {
            c = C;
            p = P;
        }
    }

我的异步序列化用于导航功能:

 protected override async Task OnNavigatedTo(NavigationEventArgs e)
    {
            string t = e.Parameter as string;

        if (!string.IsNullOrEmpty(t))
        {
            string[] _p = new string[10];
            _p = t.Split('^');
            _lista.Add(new Zajecia(t,( _p[3]+"("+_p[5]+")")));
            Dodaj_zajecia(_p);
            await Serialize(_lista);            
        }
        else
            base.OnNavigatedTo(e);

    }

我只得到这个错误而不是任何序列化:

  

System.Runtime.InteropServices.WindowsRuntime.RuntimeClass是   由于其保护级别无法访问。只有公共类型才可以   处理。

我的程序中的所有内容都是公开的,但它仍无济于事。 任何想法如何使它工作?

1 个答案:

答案 0 :(得分:1)

更新2

我检查了你的项目。问题是,您在Zajecia类中声明了BasicPage1类。您必须将其声明为单独的类文件或在命名空间范围内。

正确的方式

namespace Plan
{
    public class Zajecia
    {
     .....
    }

    public sealed partial class BasicPage1 : Plan.Common.LayoutAwarePage
    {
     .....
    }
}

错误的方式

namespace Plan
{
    public sealed partial class BasicPage1 : Plan.Common.LayoutAwarePage
    {
        public class Zajecia
        {
         .....
        }
     .....
    }
}

更新1

这是给你的代码。

public static async Task Serialize(List<Zajecia> xml_List)
{
    using (var stream = await ApplicationData.Current.LocalFolder.OpenStreamForWriteAsync("Plan list.xml", CreationCollisionOption.ReplaceExisting))
    {
        XmlSerializer serializer = new XmlSerializer(typeof(List<Zajecia>));
        using (XmlWriter xmlWriter = XmlWriter.Create(stream, new XmlWriterSettings() { Indent = true }))
        {
            serializer.Serialize(xmlWriter, xml_List);
        }
    }
}

每当你想调用方法时使用await作为前缀,假设任何按钮点击事件都调用该方法,那么我将这样写。

假设Helper是我的静态类

private async void btnSerialize_Click(object sender, RoutedEventArgs e)
{
    await Helper.Serialize(MyZajeciaList);
}

标记我在点击事件中使用async void修饰符的一件事。

假设我从DoWork(...)等任何其他方法调用方法,那么我将使用async Task代替async void

private async Task DoWork(List<Zajecia> MyZajeciaList)
{
    await Helper.Serialize(MyZajeciaList);
}

您的代码对我有用,只需将Serialize方法的返回类型从void更改为Task即可。您需要将方法调用为await Serialize(...);