对公共访问修饰符和内部访问修饰符具有不同默认值的反序列化列表

本文关键字:访问 默认值 列表 反序列化 内部 | 更新日期: 2023-09-27 18:19:11

当声明为public时,反序列化列表的默认值不为空。但是在声明为内部时为空。请帮助我理解为什么不同的访问修饰符有不同的默认值?下列代码:

namespace ConsoleApplication1
{
    internal class Program
    {
        private static void Main()
        {
            DefaultTest testclass = new DefaultTest();
            var serializer = new XmlSerializer(typeof (DefaultTest));
            string path = @"C:'Users'user'Desktop'test.xml";
            var reader = new StreamReader(path);
            DefaultTest obj = (DefaultTest) serializer.Deserialize(reader);
            Console.WriteLine("[{0}]", obj.TestStr == null ? "is null" : "is not null");
        }
    }
    public class DefaultTest
    {
        public List<string> TestStr;
    }
}

输出"is not null"。我想知道为什么?

如果我将TestStr更改为internal,它将正确输出"is null"。

public class DefaultTest
{
    internal List<string> TestStr;
}

如果我删除反序列化,那么公共和内部List声明的默认值为null。

namespace ConsoleApplication1
{
    internal class Program
    {
        private static void Main()
        {
            DefaultTest testclass = new DefaultTest();
            Console.WriteLine("[{0}]", testclass.TestStr == null ? "is null" : "is not null");
        }
    }
    public class DefaultTest
    {
        public List<string> TestStr;
    }
}

输出"is null"。

test.xml包含以下内容:

<DefaultTest>
</DefaultTest>

对公共访问修饰符和内部访问修饰符具有不同默认值的反序列化列表

在告诉您为什么这里显示的这种"奇怪"行为是满足序列化的正确方式之前:

<DefaultTest>
    <TestStr>
        <string>12</string>
        <string>56</string>
        <string>2</string>
        <string>6</string>
        <string>72</string>
    </TestStr>
</DefaultTest>

现在是null的问题。

来自MSDN的内部术语

internal关键字是类型和类型成员的访问修饰符。内部类型或成员只能在同一程序集中的文件中访问,如下例所示:

public class BaseClass 
{
    // Only accessible within the same assembly
    internal static int x = 0;
}

关于internalDeserialization不混合的原因,你可以查看hemp ANSWER.