オブジェクトのコンストラクターで読み取り専用フィールドが設定されているパブリック getter 専用プロパティを持つ読み取り専用プライベート フィールドを持つオブジェクトをシリアル化/逆シリアル化したいと考えています。ただし、次のコードは単体テストで失敗します。
using System.ComponentModel;
using FluentAssertions;
using Xunit;
using YamlDotNet.Serialization;
namespace Utilities.ComputerInventory {
public class CPU {
readonly CPUMaker cPUMaker;
public CPU() : this(CPUMaker.Generic) { }
public CPU(CPUMaker cPUMaker) {
this.cPUMaker = cPUMaker;
}
public CPUMaker CPUMaker => cPUMaker;
}
public enum CPUMaker {
[Description("Generic")]
Generic,
[Description("Intel")]
Intel,
[Description("AMD")]
AMD
}
}
namespace Utilities.ComputerInventory.UnitTests {
public class ComputerInventoryUnitTests001 {
[Fact]
public void CPUDeserializeFromYAMLSO() {
Serializer serializer = new SerializerBuilder().Build();
Deserializer deserializer = new DeserializerBuilder().Build();
CPU cPU = new CPU(CPUMaker.Intel);
CPU cPUAfterRoundTrip = deserializer.Deserialize<CPU>(serializer.Serialize(cPU));
cPUAfterRoundTrip.Should().Be(cPU);
}
}
}
これは、「テストに失敗しました」というメッセージで失敗します
Message: YamlDotNet.Core.YamlException : (Line: 1, Col: 1, Idx: 0) - (Line: 1, Col: 1, Idx: 0): Exception during deserialization
---- System.Runtime.Serialization.SerializationException : Property 'CPUMaker' not found on type 'Utilities.ComputerInventory.CPU'.
そしてスタックトレース表示
Test Name: CPUDeserializeFromYAMLSO
Test FullName: Utilities.ComputerInventory.UnitTests.ComputerInventoryUnitTests001.CPUDeserializeFromYAMLSO
Test Source: <obfuscated>\test1.cs
Test Outcome: Failed
Test Duration: 0:00:00.11
Result StackTrace:
at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer)
at YamlDotNet.Serialization.ValueDeserializers.AliasValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer)
at YamlDotNet.Serialization.Deserializer.Deserialize(IParser parser, Type type)
at YamlDotNet.Serialization.Deserializer.Deserialize(TextReader input, Type type)
at YamlDotNet.Serialization.Deserializer.Deserialize[T](String input)
at Utilities.ComputerInventory.UnitTests.ComputerInventoryUnitTests001.CPUDeserializeFromYAMLSO() in <obfuscated>\test1.cs:line 43
----- Inner Stack Trace -----
at YamlDotNet.Serialization.TypeInspectors.TypeInspectorSkeleton.GetProperty(Type type, Object container, String name, Boolean ignoreUnmatched)
at YamlDotNet.Serialization.NodeDeserializers.ObjectNodeDeserializer.YamlDotNet.Serialization.INodeDeserializer.Deserialize(IParser parser, Type expectedType, Func`3 nestedObjectDeserializer, Object& value)
at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer)
Result Message:
YamlDotNet.Core.YamlException : (Line: 1, Col: 1, Idx: 0) - (Line: 1, Col: 1, Idx: 0): Exception during deserialization
---- System.Runtime.Serialization.SerializationException : Property 'CPUMaker' not found on type 'Utilities.ComputerInventory.CPU'.
CPU オブジェクトの cPU インスタンスを単純にシリアル化すると、次のような YAML が生成されます。"CPUMaker: Intel\r\n"
12/23/16 (13 か月前) に尋ねられた同様の SO の質問 ( YamlDotNet can't find property ) があるようですが、誰も回答もコメントもしていません。
概要: YamlDotNet を使用して、読み取り専用フィールドに裏打ちされたゲッターのみのプロパティを持つオブジェクトをシリアル化/逆シリアル化する適切な方法は何ですか?
どんな助けでもTIA!