什么是.NET对象最灵活的序列化,但易于实现?

时间:2008-09-20 00:44:26

标签: c# .net json serialization json.net

我想序列化和反序列化对象,而不必担心整个类图。

灵活性是关键。我希望能够序列化传递给我的任何对象,而不需要整个对象图中需要完整的属性。

  

这意味着二进制序列化   不是一个选项,因为它只适用于   其他.NET平台。我会   也喜欢可读的东西   人,因此可以辨认   管理计划等   解释器。

我发现使用DataContract,JSON和XML Serializers时遇到了问题。

  • 大多数错误似乎都围绕列表/词典的序列化(即XML Serializable Generic Dictionary)。
  • “添加静态未知的任何类型 到已知类型列表 - for 例如,通过使用 KnownTypeAttribute属性或 将它们添加到已知的列表中 传递给的类型 DataContractSerializer的“。

请根据实际经验而不是理论或阅读文章来解答答案。

12 个答案:

答案 0 :(得分:53)

您是否考虑过序列化为JSON而不是XML?

Json.NET有一个非常强大且灵活的序列化程序,它对Hashtables /泛型字典没有任何问题,并且不需要任何特定属性。我知道,因为我写了它:)

它通过序列化程序上的各种选项为您提供大量控制,它允许您通过为其创建JsonConverter来覆盖类型的序列化方式。

在我看来,JSON比XML更具人性可读性,而Json.NET提供了编写格式良好的JSON的选项。

最后,该项目是开源的,因此您可以进入代码并根据需要进行修改。

答案 1 :(得分:3)

如果我记得它的作用与此属性类似:

[XmlArray("Foo")]
[XmlArrayItem("Bar")]
public List<BarClass> FooBars
{ get; set; }

如果你序列化了这个,你会得到类似的东西:

<Foo>
    <Bar />
    <Bar />
</Foo>

当然,我应该听从专家的意见。以下是来自MS的更多信息:http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlarrayitemattribute.aspx

如果有效,请告诉我。

答案 2 :(得分:2)

根据您的要求,听起来像Xml序列化是最好的。

序列化时,您对集合有什么问题?如果您指的是不知道要在List或类似的东西上使用什么属性,您可以尝试使用 属性上的XmlArray属性。你绝对可以序列化一个集合。

答案 3 :(得分:1)

XNA Framework中的IntermediateSerializer非常酷。您可以在http://blogs.msdn.com/shawnhar

找到一些有关使用它的教程

答案 4 :(得分:1)

SOAP序列化对我来说效果很好,即使对于未标记为[Serializable]

的对象也是如此

答案 5 :(得分:1)

如果集合中的对象包含对同一集合中其他对象的任何引用,则集合序列化会出现问题。如果存在任何类型的双指向,则最终会创建无法序列化的多地图。在我曾经序列化自定义集合的每个问题上,总是因为我需要的一些附加功能作为“典型”客户端 - 服务器应用程序的一部分工作得很好,然后作为消费者提供者的一部分失败了-server application。

答案 6 :(得分:1)

将要序列化的所有类放入单独的程序集中,然后使用sgen工具生成序列化程序集以序列化为XML。使用XML属性来控制序列化。

如果您需要自定义序列化程序集(并且 需要它来支持不是IXmlSerializable的类和包含抽象节点的类),那么请指示sgen将源代码转储到单独的文件,然后将其添加到您的解决方案。然后你可以根据需要修改它。

http://msdn.microsoft.com/en-us/library/bk3w6240(VS.80).aspx

FWIW,我已经设法使用这种技术序列化整个AdsML Framework(超过400个类)。它确实需要大量的手动定制,但是如果你考虑框架的大小,就没有办法解决这个问题。 (我使用了一个单独的工具从XSD转到C#)

答案 7 :(得分:1)

我同意基于DataContract的序列化方法(对于JSON,XML等)比我想要的要复杂一些。

如果您正在尝试获取JSON,请查看http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx

它是MS AJAX扩展的一部分。不可否认,它在.NET 3.5中被标记为过时,但ScottGu在他的博客评论中提及(http://weblogs.asp.net/scottgu/archive/2007/10/01/tip-trick-building-a-tojson-extension-method-using-net-3-5.aspx#4301973),他不确定为什么,应该支持更长时间。

答案 8 :(得分:0)

最简单的方法是使用Serializable属性标记对象,然后使用二进制格式化程序来处理序列化。只要任何包含的对象也标记为Serializable,整个类图应该不是问题。

答案 9 :(得分:0)

使用BinaryFormatter

序列化可能更有效

http://blog.paranoidferret.com/index.php/2007/04/27/csharp-tutorial-serialize-objects-to-a-file/

复制
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

public class Serializer
{
   public Serializer()
   {
   }

   public void SerializeObject(string filename,
                  ObjectToSerialize objectToSerialize)
   {
      Stream stream = File.Open(filename, FileMode.Create);
      BinaryFormatter bFormatter = new BinaryFormatter();
      bFormatter.Serialize(stream, objectToSerialize);
      stream.Close();
   }

   public ObjectToSerialize DeSerializeObject(string filename)
   {
      ObjectToSerialize objectToSerialize;
      Stream stream = File.Open(filename, FileMode.Open);
      BinaryFormatter bFormatter = new BinaryFormatter();
      objectToSerialize =
         (ObjectToSerialize)bFormatter.Deserialize(stream);
      stream.Close();
      return objectToSerialize;
   }
}

答案 10 :(得分:0)

为了实现互操作性,我们一直使用Xml序列化,并确保我们的课程是从头开始设计的。

我们创建一个XSD架构文档,并使用XSD.exe生成一组类。这会生成部分类,因此我们创建一组相应的部分类来添加我们想要的额外方法来帮助我们填充类并在我们的应用程序中使用它们(因为它们专注于序列化和反序列化,并且有时难以使用)。

答案 11 :(得分:0)

您应该使用NetDataContractSerializer。它涵盖了任何类型的对象图,并支持泛型,列表,多态(此处不需要KnownType属性),递归等。 唯一的缺点是您必须使用[Serializable] / [DataContract]属性标记所有类,但经验表明您必须进行某种手动微调,因为并非所有成员都应该保留。 它也序列化为Xml,虽然它的可读性值得怀疑。

我们有与您相同的要求并选择了此解决方案。