c# - 序列化循环引用对象的最佳方法是什么?

标签 c# json serialization

最好是文本格式。最好的是 json,带有一些指向指针的标准。二进制也不错。记得在过去,肥皂是标准的。你有什么建议?

最佳答案

binary 没问题无论如何:

[Serializable]
public class CircularTest
{
    public CircularTest[] Children { get; set; }
}

class Program
{
    static void Main()
    {
        var circularTest = new CircularTest();
        circularTest.Children = new[] { circularTest };
        var formatter = new BinaryFormatter();
        using (var stream = File.Create("serialized.bin"))
        {
            formatter.Serialize(stream, circularTest);
        }

        using (var stream = File.OpenRead("serialized.bin"))
        {
            circularTest = (CircularTest)formatter.Deserialize(stream);
        }
    }
}

A DataContractSerializer也可以应对循环引用,你只需要使用一个特殊的构造函数并指出这一点,它就会吐出 XML:

public class CircularTest
{
    public CircularTest[] Children { get; set; }
}

class Program
{
    static void Main()
    {
        var circularTest = new CircularTest();
        circularTest.Children = new[] { circularTest };
        var serializer = new DataContractSerializer(
            circularTest.GetType(), 
            null, 
            100, 
            false, 
            true, // <!-- that's the important bit and indicates circular references
            null
        );
        serializer.WriteObject(Console.OpenStandardOutput(), circularTest);
    }
}

和最新版本Json.NET JSON 也支持循环引用:

public class CircularTest
{
    public CircularTest[] Children { get; set; }
}

class Program
{
    static void Main()
    {
        var circularTest = new CircularTest();
        circularTest.Children = new[] { circularTest };
        var settings = new JsonSerializerSettings 
        { 
            PreserveReferencesHandling = PreserveReferencesHandling.Objects 
        };
        var json = JsonConvert.SerializeObject(circularTest, Formatting.Indented, settings);
        Console.WriteLine(json);
    }
}

产生:

{
  "$id": "1",
  "Children": [
    {
      "$ref": "1"
    }
  ]
}

我想这就是您要问的问题。

关于c# - 序列化循环引用对象的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7545005/

相关文章:

c# - 定义集合元素的 LINQ 语句问题

arrays - 使用Jackson以UTF-8编码将Java列表转换为JSON数组

无法完成 Java String 到 JSON 的转换

javascript - 如何将其序列化为 JSON?

php - 在 PHP 中打印多个反序列化数组

c# - 如果我在子类中实现 ISerializable,父类是否也必须如此?

c# - 如何确定该程序集是从 f# 项目编译而来的?

c# - 将定义常量传递给 dotnet build 会杀死目标框架符号

json - vagrant box 添加无法识别本地元数据 json 文件

c# - 为什么语音识别可以在网页中工作,而在 Electron 中却不行