Introduction

VB.NET は大文字小文字を区別しない仕様で、Xml の逆シリアライズに影響するのか?と疑問に思ったので、C# と合わせて確認してみた。

サンプルソースは、GitHub に置きました。

Result

結論から言えば、C#/VB.NET の双方で、Xml 内の大文字小文字は明確に区別していた。
大文字小文字を区別しないマークアップ言語は Html です。

テストデータ

クラス名が 大文字か小文字かどうかが違うだけ。
下記の二つを C#/VB.NET のプログラムで逆シリアライズしてみます。

1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Member>0</Member>
</Test>
1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<TEST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Member>0</Member>
</TEST>

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
using System.Xml.Serialization;
using NLog;

namespace DemoCSharp
{

internal sealed class Program
{

#region Fields

private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

#endregion

#region Methods

private static void Main()
{
TestDeserialize<Test>("TestUpper.xml");
TestDeserialize<Test>("TestLower.xml");
TestDeserialize<TEST>("TestUpper.xml");
TestDeserialize<TEST>("TestLower.xml");
}

#region Helpers

private static void TestDeserialize<T>(string filename)
{
try
{
var serializer = new XmlSerializer(typeof(T));
using var fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read);
serializer.Deserialize(fileStream);
Logger.Info($"Succeed to deserialize {typeof(T).FullName} from {filename}");
}
catch
{
Logger.Error($"Failed to deserialize {typeof(T).FullName} from {filename}");
}
}

#endregion

#endregion

}

public sealed class Test
{

public int Member
{
get;
set;
}

}

public sealed class TEST
{

public int Member
{
get;
set;
}

}

}

VB.NET

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Imports System.IO
Imports System.Xml.Serialization

Imports NLog

Module Program

#Region "Fields"

Private ReadOnly Logger = LogManager.GetCurrentClassLogger()

#End Region

#Region "Methods"

Sub Main(args As String())
TestDeserialize(Of Test)("TestUpper.xml")
TestDeserialize(Of Test)("TestLower.xml")
End Sub

#End Region

#Region "Helpers"

Sub TestDeserialize(Of T)(filename As String)
Try
Dim serializer = New XmlSerializer(GetType(T))
Using fileStream = New FileStream(filename, FileMode.Open, FileAccess.Read)
serializer.Deserialize(fileStream)
End Using
Logger.Info($"Succeed to deserialize {GetType(T).FullName} from {filename}")
Catch ex As Exception
Logger.Error($"Failed to deserialize {GetType(T).FullName} from {filename}")
End Try
End Sub

#End Region

End Module

Public Class Test
Public Property Member As Integer
End Class

'Can not declare
'Public Class TEST
' Public Property Member As Integer
'End Class

実行

1
2
3
4
5
6
7
8
Run DemoCSharp
2022-07-05 21:50:25.7322 [ERROR] Failed to deserialize DemoCSharp.Test from TestUpper.xml
2022-07-05 21:50:25.7703 [INFO ] Succeed to deserialize DemoCSharp.Test from TestLower.xml
2022-07-05 21:50:25.7742 [INFO ] Succeed to deserialize DemoCSharp.TEST from TestUpper.xml
2022-07-05 21:50:25.7742 [ERROR] Failed to deserialize DemoCSharp.TEST from TestLower.xml
Run DemoVisualBasic
2022-07-05 21:50:27.5853 [ERROR] Failed to deserialize DemoVisualBasic.Test from TestUpper.xml
2022-07-05 21:50:27.6247 [INFO ] Succeed to deserialize DemoVisualBasic.Test from TestLower.xml

当たり前と言えば当たり前。
いくら VB.NET が大文字小文字を区別しないと言えど、逆シリアライズで大文字小文字を区別しなかったら、逆シリアライズ先のクラスを一意に特定できないしね。

Source Code

https://github.com/takuya-takeuchi/Demo/tree/master/Misc/08_UpperLowerCaseXmlSerialize