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