C# 将对象保存到文件-什么是常见的替代序列化方法?

C# 将对象保存到文件-什么是常见的替代序列化方法?,c#,serialization,C#,Serialization,编辑:原来的问题是出于误解,并已更新 来自其他语言的C#似乎没有简单的方法将对象和组件直接转储到文件中,这似乎有些奇怪 让我们以java为例,在这里我可以将任何对象转储到文件并加载,而没有明显的限制: //Save object to file: FileOutputStream saveFile = new FileOutputStream(---filePath---); ObjectOutputStream save = new ObjectOutputStream(saveF

编辑:原来的问题是出于误解,并已更新

来自其他语言的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]
标记

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


多亏了注释,我尝试了XML方法,但也不起作用,因为它无法序列化ArrayList,如图所示


看起来JSON是唯一可以轻松实现的方法,或者有没有其他方法可以在不需要大量代码的情况下使用普通C#库进行序列化?

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

虽然基本库中没有介绍,但在这种情况下,使用JSON看起来是最好的选择,我计划使用JSON.NET,可以在这里找到:


另一个好的选择是Google Gson:

序列化
==
将对象转换为可存储用于重建的格式。那么,您的问题到底是什么呢?给定,除了支持序列化的Java对应代码块与一个文件包含一个对象的.NET相比,我看不出这两个代码块之间有什么区别。为什么不想使用内置的序列化方法?ObjectOutputStream不是序列化程序吗?我没有考虑使用.NET版本的ObjectOutputStream,即二进制格式化程序。您对BinaryFormatter的附加控件是否有异议?只有。如果您想对不带该属性的类进行二进制序列化,并且您了解其后果,请使用不同的序列化方式(如上面提到的XML/JSON/…仅序列化公共属性)或。@sorifiend:不仅如此,但是,
BinaryFormatter
几乎是最糟糕的序列化方法(封闭格式、不支持版本控制、速度慢)。这是可悲的,因为它显然是.NET中的“一流公民”。
  //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);