1. ホーム
  2. プログラミング言語
  3. シーピー

c# - デシリアライズ・エラー。入力文字列が正しい形式でない

2022-01-22 04:33:23

1. 質問です。

Nullableフィールドのデシリアライズの問題は、これまで慎重に検討されたことはなく、シリアライズとデシリアライズは同じ人またはTeamが書いた場合、問題を隠すことができるため、問題は見つかっていないようです。

コードをご覧ください。

public class A
{
    public String Name { get; set; }
    public decimal? Value {get; set;}
    public bool ShouldSerializeValue()
    {
        return this.Value.HasValue;
    }
}

class Program  
{  
    static void Main(string[] args)  
    {  
  
        string xmlContent =   
@"<A>  
    <Name>aa</Name>  
    <Value/>  
</A>";  
        // DeserializeXML method please refer to: http://blog.csdn.net/yuxuac/article/details/16830589  
        A a2 = Serializer.DeserializeXML<A>(xmlContent);   
  
        Console.ReadLine();  
    }  
} 

皆さんは、このコードが正しく実行されると思いますか? 

答えはノーです、エラーメッセージが出ます。入力文字列が正しい形式ではありません。


2. 原因分析。

原因は何なのか?

ShouldSerialize() メソッドから始めましょう。その役割は、そのメソッドの署名で見ることができ、特定のフィールドがシリアライズされるかどうかを制御します(もちろん、通常は、Nullable型のフィールドがシリアライズされるときに制御するために使用されます)。

次のような例を考えてみましょう。

1. Aオブジェクトを直接シリアライズする場合、意図的にValueに値を代入しない。

A a = new A(){ Name = "aa"};
string str = Util.SerializeXML(a);

XML社長はこのようになり、メソッドShouldSerializeValue()を定義します。その定義では、Valueは値がある場合のみシリアライズされると明示的に記述されているので、Valueノードはシリアライズされません:そのため