【问题标题】:Save object to file - What are common alternate serialization methods?将对象保存到文件 - 常见的替代序列化方法是什么?
【发布时间】:2014-10-18 14:02:07
【问题描述】:

编辑:最初的问题是由于误解而提出的,并且已经更新。

来自其他语言的 C# 似乎没有一种简单的方法将对象和组件等内容直接转储到文件中,这似乎很奇怪。

让我们以 java 为例,我可以将任何对象转储到文件并加载,没有明显的限制:

  //Save object to file:
  FileOutputStream saveFile = new FileOutputStream(---filePath---);
  ObjectOutputStream save = new ObjectOutputStream(saveFile);
  save.writeObject(---YorObjectHere---);

  //Load object from file
  FileInputStream saveFile = new FileInputStream(---filePath---);
  ObjectInputStream save = new ObjectInputStream(saveFile);
  ---ObjectType--- loadedObject = (---ObjectType---) save.readObject();

这种事情在 C# 中可以轻松实现吗?

我已经尝试过标准的序列化方法:

  //Save object to file:
  IFormatter formatterSave = new BinaryFormatter();
  Stream streamSave = new FileStream(---filePath---, FileMode.Create, FileAccess.Write, FileShare.None);
  formatterSave.Serialize(streamSave, ---ObjectToSave---);

  //Load object from file
  IFormatter formatterLoad = new BinaryFormatter();
  Stream streamLoad = new FileStream(---filePath---, FileMode.Open, FileAccess.Read, FileShare.Read);
  ---ObjectType--- ---LoadedObjectName--- = (---ObjectType---)formatterLoad.Deserialize(streamLoad);

虽然此方法操作起来很简单,但它并不总是适用于现有或锁定的代码,因为无法始终添加 [serializable] 标记。

那么序列化的最佳替代方案是什么?


感谢 cmets,我尝试了 XML 方法,但它也不起作用,因为它无法序列化 ArrayList,如 MSDN 所示

  //Save object to file:
  var serializerSave = new XmlSerializer(typeof(objectType));
  writer = new StreamWriter(filePath, append);
  serializerSave.Serialize(writer, objectToWrite);

  //Load object from file
  var serializerLoad = new XmlSerializer(typeof(objectType));
  reader = new StreamReader(filePath);
  return (T)serializerLoad.Deserialize(reader);

看起来 JSON 是唯一可以轻松做到这一点的方法,还是有另一种替代方法可以使用普通 C# 库进行序列化而不需要大量代码?

【问题讨论】:

  • 序列化== 将对象转换为可以存储用于重建的格式。那么你的问题到底是什么?
  • 鉴于ObjectOutputStream requires the object to save to implement Serializable,除了支持序列化序列化的Java 对应物与一个文件包含一个对象的.NET 相比,我真的看不出这两个代码块之间的区别。为什么您想使用内置的序列化方法?
  • ObjectOutputStream 不是序列化器吗?我错过了使用 .NET 版本的 ObjectOutputStream,即 BinaryFormatter 的问题。是您使用 BinaryFormatter 获得的额外控制权吗?
  • BinaryFormatter requires [Serializable]。如果您想对不带有该属性的类进行二进制序列化并且您了解后果,请使用不同的序列化方式(如上面提到的 XML/JSON/...,仅序列化公共属性)或using a surrogate。跨度>
  • @sorfiend:不仅如此,BinaryFormatter 几乎是您可以采用的序列化最糟糕的方法(封闭格式,不支持版本控制,速度缓慢)。鉴于其在 .NET 中明显的“一等公民身份”,这很可悲。

标签: c# serialization


【解决方案1】:

感谢那些评论并指出我正确方向的人。

虽然它没有包含在基本库中,但在这种情况下使用 JSON 看起来是最好的替代方案,我打算使用 Json.NET,可以在这里找到:http://www.nuget.org/packages/Newtonsoft.Json

另一个不错的选择是 Google Gson:https://code.google.com/p/google-gson/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多