Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对于.NET对象,哪种序列化方式最灵活,但实现起来最简单?_C#_.net_Json_Serialization_Json.net - Fatal编程技术网

C# 对于.NET对象,哪种序列化方式最灵活,但实现起来最简单?

C# 对于.NET对象,哪种序列化方式最灵活,但实现起来最简单?,c#,.net,json,serialization,json.net,C#,.net,Json,Serialization,Json.net,我希望序列化和反序列化对象,而不必担心整个类图 灵活性是关键。我希望能够序列化传递给我的任何对象,而不需要在整个对象图中使用完整的属性 这意味着二进制序列化 不是选项,因为它仅适用于 其他.NET平台。我会的 也像是一个读者可以阅读的东西 人,因此可由 管理程序和其他 口译员 我发现使用DataContract、JSON和XML序列化程序时存在问题 大多数错误似乎都围绕着列表/字典的序列化(即) “添加任何静态未知的类型 到已知类型的列表-对于 例如,通过使用 KnownTypeAttribu

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

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

这意味着二进制序列化 不是选项,因为它仅适用于 其他.NET平台。我会的 也像是一个读者可以阅读的东西 人,因此可由 管理程序和其他 口译员

我发现使用DataContract、JSON和XML序列化程序时存在问题

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

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

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

XNA框架中的IntermediateSerializer非常酷。您可以在

上找到一系列关于使用它的教程,SOAP序列化对我来说效果很好,即使对于没有标记为[Serializable]

的对象,从您的需求来看,Xml序列化似乎是最好的

序列化时,集合有哪些问题?如果您指的是不知道要在列表或类似对象上使用哪些属性,您可以尝试
属性上的XmlArray属性。您完全可以序列化集合。

如果集合中的对象包含对同一集合中其他对象的引用,则集合序列化将出现问题。如果存在任何类型的双指向,则最终将创建无法序列化的多重映射。在序列化自定义集合时遇到的每一个问题上,都是因为我需要一些附加的功能,这些功能作为“典型”客户机-服务器应用程序的一部分可以正常工作,但作为消费者-提供商-服务器应用程序的一部分却失败了。

如果我回忆起来,它的工作原理与以下属性类似:

[XmlArray("Foo")]
[XmlArrayItem("Bar")]
public List<BarClass> FooBars
{ get; set; }
[XmlArray(“Foo”)]
[XmlArrayItem(“Bar”)]
公共酒吧名单
{get;set;}
如果将其序列化,您将得到如下结果:

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

当然,我可能应该听从专家的意见。以下是MS提供的更多信息:


让我知道这是否适合您。

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

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


FWIW,我已经使用这种技术成功地序列化了整个AdsML框架(超过400个类)。它确实需要大量的手工定制,但是如果考虑框架的大小,就无法绕过它。(我使用了一个单独的工具从XSD到C#)

也许更有效的方法是使用BinaryFormatter进行序列化

抄袭自


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

有一个非常强大和灵活的序列化程序,它与哈希表/通用字典没有任何问题,并且不需要任何特定属性。我知道是因为我写的:)

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

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


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

为了实现互操作性,我们一直使用Xml序列化,并确保我们的类从一开始就设计正确


我们创建一个XSD模式文档,并使用XSD.exe从中生成一组类。这将生成分部类,因此我们随后创建一组相应的分部类,以添加额外的方法,以帮助我们填充这些类并在应用程序中使用它们(因为它们侧重于序列化和反序列化,有时使用起来有点困难)。

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


我们的需求与您的相同,因此选择了此解决方案。

我同意基于DataContract的序列化方法(到JSON、XML等)比我希望的要复杂一些

如果您试图获取JSON,请签出


它是MS AJAX扩展的一部分。诚然,它在.NET3.5中被标记为过时,但ScottGu在他的博客评论中提到()他不确定为什么,应该支持更长的时间。

不确定Bradleyt先生是否想忽略类图的某些部分,他说他不想担心它。在这种情况下,并非所有属性都需要可序列化(NonSe)
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;
   }
}