加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 08:31:59 所属栏目:百科 来源:网络整理
导读:更好的是文本格式.最好的是json,有一些标准指针.二进制也不错.记住,在过去,肥皂已经成为了这一点.你的建议是什么? 解决方法 没有任何问题 binary: [Serializable]public class CircularTest{ public CircularTest[] Children { get; set; }}class Program{
更好的是文本格式.最好的是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);
        }
    }
}

一个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"
    }
  ]
}

我想这就是你所问的问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读