【问题标题】:C# object serializationC# 对象序列化
【发布时间】:2019-12-16 08:45:16
【问题描述】:

如果不能将基类标记为可序列化,如何序列化 c# 类。

我在 c# wpf 应用程序中使用 Caliburn Micro,MyViewModel 派生自 Screen (https://caliburnmicro.com/documentation/composition)。我需要将 MyViewModel 的 (Xml 序列化器 / BinarySerializer / DataContractSerializer) 对象序列化到一个文件中,以便我以后可以使用它。

我可以将 MyViewModel 标记为 [Serializable],但出现异常,即基类(来自 caliburn micro 的 Screen)未标记为 [Serializable],因此无法序列化对象。我无法在 Screen 中将属性添加为 [Serializable],因为它是第三方库。

谁能建议我如何序列化 MyViewModel 对象?

[Serializable]
public class MyViewModel : Screen
{
  // Rest of functionalities
}

我遇到了异常:在程序集“Caliburn.Micro, Version=3.2.0.0, Culture=neutral, PublicKeyToken=1f2ed21f”中键入“Caliburn.Micro.Screen”未标记为可序列化。

【问题讨论】:

  • 您是否仅限于使用内置的 .NET 序列化程序?有很多第三方序列化器,例如 JSON.NET,它们不需要 [Serializable] 属性。
  • 在典型的 MVVM 应用程序中,您将序列化模型而不是视图模型。
  • 我使用 NewtonSoft Json 进行 JsonSerialization 但得到空白字符串。示例:newtonsoft.com/json/help/html/SerializingJSON.htm

标签: c#


【解决方案1】:

以下链接帮助解决了我的问题

DataContractSerializer: How to serialize classes/members without DataContract/DataMember attributes

Why do I need a parameterless constructor?

伪代码: 序列化:

using (var stream = File.Open(filePath, FileMode.Create))
            {
                var writer = new DataContractSerializer(myViewModelObject.GetType());
                writer.WriteObject(stream, myViewModelObject);
                stream.Close();
            }

反序列化:

using (var fs = new FileStream(filePath, FileMode.Open))
            {
                var reader = XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());
                var deserializer = new DataContractSerializer(MyViewModel);
                var deserializedType = deserializer.ReadObject(reader, true);
                reader.Close();
                fs.Close();
                return deserializedType;
            }

【讨论】:

    猜你喜欢
    • 2012-09-12
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 2011-03-12
    相关资源
    最近更新 更多