序列化没有价值

时间:2019-06-19 23:44:41

标签: c# serialization

编辑:我创建一个简单样本的尝试失败。我以为我已经用真实的代码复制了这个问题,但是实际上这只是一个未设置为public的值,所以我的序列化失败了。

原始帖子:

我有一个要在其上设置值的类(下面的A。)另一个类中有一个A,并且有一个A值的设置器(下面是B)。我在列表和一系列数据中有一堆B foreach的演员表。在所有内容中,我都调用了setter,但是所有这些的结果是一个列表,其中似乎从未调用过setter。这里出了什么问题,我如何获得新的价值?

我能够用一组更简单的代码重现该问题。

这是一个小提琴:https://dotnetfiddle.net/B4YVHU

或者,这是代码:

using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;

namespace ConsoleApplication28
{
    class A
    {
        public string value = null;
    }

    class B
    {
        private A a = new A();

        public void SetAValue(string s)
        {
            Console.WriteLine($"Value is set to: {s}");
            a.value = s;
        }
    }

    public class Program
    {
        public static void Main(string[] args)
        {
            object list = new List<B> { new B(), new B() };

            if ( list is IEnumerable<object> enumerable)
            {
                foreach (var value in enumerable)
                {
                    if (value is B a)
                    {
                        a.SetAValue("blooop");
                    }
                }
            }

            Console.WriteLine(Serialization.SerializeJson(list));
        }
    }

    // You can ignore this. It's just to more easily display the object result
    class Serialization
    {
        private static JsonSerializer _serializer;

        static Serialization()
        {
            _serializer = new JsonSerializer();
        }

        public static string SerializeJson<T>( T value )
        {
            string jsonString;
            using ( var stringWriter = new StringWriter() )
            using ( var writer = new JsonTextWriter( stringWriter ) )
            {
                _serializer.Serialize(writer, value);
                jsonString = stringWriter.ToString();
            }
            return jsonString;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

在课程B中的

public A a {get; set;} = new A(); 为了序列化,变量必须是公共的。

https://dotnetfiddle.net/B4YVHU