在 C# 中序列化和反序列化自引用对象

Posted

技术标签:

【中文标题】在 C# 中序列化和反序列化自引用对象【英文标题】:serialize and deserialize self reference object in c# 【发布时间】:2015-09-16 06:37:56 【问题描述】:

我有这样的A类

class A
    
        public string Type  get; set; 
        public object[] Content  get; set; 
        public string[] jsonContent  get; set; 

        public A()
        

        

        public A(string type)
        
            this.Type = type;
        

        public A(string type, object[] content)
        
            this.Type = type;
            this.Content = content;
        

        public string ToJson()
        
        int len = Content.Length;
        string[] jsonContentTmp = new string[len];
        for (int i = 0; i < Content.Length; ++i)
        
            jsonContentTmp[i] = JsonConvert.SerializeObject(Content[i]);
        
        jsonContent = jsonContentTmp;
        var json = JsonConvert.SerializeObject(this);
        return json;
        

        public static A ToA(string str)
        
        Request a = JsonConvert.DeserializeObject<A>(str);
        return a;
        
    

考虑如下:

A sub1 = new A();
A sub2 = new A();
object[] obj = sub1, sub2;
A test = new A("type", obj);

当我想序列化test时,我收到异常

自我参考

我尝试了PreserveReferencesHandling,但我无法反序列化并收到异常

'无法保留对数组的引用'

。 任何想法序列化和反序列化它?

【问题讨论】:

【参考方案1】:

所以看起来这样做是为了防止 *** 异常。没有双关语的意思。您必须打开 PreserveReferences 才能启用自引用:

Serialising Circular references

在 Global.asax 的 AppStart 中尝试以下操作:

var jsonSerializerSettings = new JsonSerializerSettings

    PreserveReferencesHandling = PreserveReferencesHandling.Objects
;

GlobalConfiguration.Configuration.Formatters.Clear();
GlobalConfiguration.Configuration.Formatters.Add(new JsonNetFormatter(jsonSerializerSettings));

【讨论】:

以上是关于在 C# 中序列化和反序列化自引用对象的主要内容,如果未能解决你的问题,请参考以下文章

C#序列化和反序列化到底是啥意思?

guid的值为null如何在C#反序列化

C#中如何实现多个观测数据对象序列化和反序列化?

用C#怎么写一个自定义的序列化和反序列化的类

在C#中序列化和反序列化之间保留xml元素的顺序

C#网络编程学习---序列化和反序列化