【问题标题】:How to use deserialized object?如何使用反序列化的对象?
【发布时间】:2013-08-27 12:01:22
【问题描述】:

我正在 C# 中为 Windows 8 应用程序序列化和反序列化一个对象。

我在将对象传递给下一个视图之前对其进行序列化,因为传递对象会抛出异常。

函数 OnNavigatedTo:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
   base.OnNavigatedTo(e);
   string XMLString = e.Parameter.ToString();
   var thisChannel = XmlDeserializeFromString(XMLString, typeof(Channel));
 ....}

反序列化函数:

  public static Channel XmlDeserializeFromString<Channel>(string objectData)
    {
        return (Channel)XmlDeserializeFromString(objectData, typeof(Channel));
    }

    public static object XmlDeserializeFromString(string objectData, Type type)
    {
        var serializer = new XmlSerializer(type);
        object result;

        using (TextReader reader = new StringReader(objectData))
        {
            result = serializer.Deserialize(reader);
        }

        return result;
    }

我想访问此对象中的数据,但类似:thisChannel.Name 不起作用。而且我不知道如何才能继续使用此对象。

【问题讨论】:

  • var thisChannel = (Channel)XmlDeserializeFromString(XMLString, typeof(Channel));也许?或者使用其他可用的方法 var thisChannel = XmlDeserializeFromString(XMLString);

标签: c# serialization windows-8


【解决方案1】:

首先在此行中删除var

 //var thisChannel = XmlDeserializeFromString(XMLString, typeof(Channel));
 Channel thisChannel = XmlDeserializeFromString(XMLString, typeof(Channel));

and then you will at least get an error when the wrong object XmlDeserializeFromString() is selected.

并确保您使用正确的:

 Channel thisChannel = XmlDeserializeFromString<Channel>(XMLString);

重载应谨慎使用,一般不要与类型参数混合使用。

【讨论】:

  • 非常感谢这个答案和@Ric 对我的问题的评论,我能够解决问题。解决方案是这样做: Channel thisChannel = (Channel)XmlDeserializeFromString(XMLString, typeof(Channel));
  • 现在我注意到了:Channel thisChannel = XmlDeserializeFromString(XMLString);也可以;)谢谢 :)
【解决方案2】:

XmlDeserializeFromString 返回一个object,它没有Name 属性。您需要:

  1. 将其转换为您想要使用的类型
  2. 使用您添加的通用方法:

    var thisChannel = XmlDeserializeFromString<Channel>(XMLString);`
    
  3. 在运行时使用dynamic解析方法名
  4. 在运行时使用反射查找Name 属性

【讨论】:

    【解决方案3】:

    是 JSON > XML,虽然你想坚持使用 XML,但使用 TCD.Serialization,它提供序列化和反序列化 XML 和 JSON 到/来自流和字符串。

    .

    【讨论】:

      【解决方案4】:

      不要这样做。

      通过导航参数传递非原始类型将导致您的应用程序在从挂起恢复时崩溃。

      只在 Windows 8 应用程序中将原始类型作为导航参数传递。

      SuspensionManager Error when application has more than 1 page in windows 8 XAML/C# app

      【讨论】:

      • 嘿乔恩,这就是为什么我首先序列化我的对象。即使我仍然遇到 Bitmaps 问题,我将 [XmlIgnore] 放在位图图像的定义之前。
      • 你还是应该看看视频。 channel9.msdn.com/Events/Build/2013/3-133
      猜你喜欢
      • 2021-12-08
      • 2019-06-03
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 2019-10-25
      • 2011-02-27
      • 1970-01-01
      相关资源
      最近更新 更多