2

c#3.5 で xml 文字列を逆シリアル化しようとしていますが、以下のコードは c# 4.0 で機能します。C#3.5 のコードで実行しようとすると、コードObject reference not set to an instance of an objectが XmlSerializer を初期化しようとすると例外が発生します。

どんな助けでも大歓迎です。

string xml = "<boolean xmlns=\"http://schemas.microsoft.com/2003/10/serialization/\">false</boolean>";
var xSerializer = new XmlSerializer(typeof(bool), null, null,
             new XmlRootAttribute("boolean"),
             "http://schemas.microsoft.com/2003/10/serialization/");

             using (var sr = new StringReader(xml))
            using (var xr = XmlReader.Create(sr))
            {
                var y = xSerializer.Deserialize(xr);
            }

System.NullReferenceException was unhandled
  Message="Object reference not set to an instance of an object."
  Source="System.Xml"
  StackTrace:
       at System.Xml.Serialization.XmlSerializer..ctor(Type type, XmlAttributeOverrides overrides, Type[] extraTypes, XmlRootAttribute root, String defaultNamespace, String location, Evidence evidence)
       at System.Xml.Serialization.XmlSerializer..ctor(Type type, XmlAttributeOverrides overrides, Type[] extraTypes, XmlRootAttribute root, String defaultNamespace)
       ....
       at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 
4

1 に答える 1

1

.NET 3.5では、Type[] extraTypesがnullになるのは気に入らないようです。Type[]たとえば、代わりに空を渡すnew Type[0]か、単に次のようにします。

var xSerializer = new XmlSerializer(typeof(bool), null, Type.EmptyTypes, 
                 new XmlRootAttribute("boolean"),
                 "http://schemas.microsoft.com/2003/10/serialization/");

補足として:重要XmlSerializerなコンストラクター(このような)を使用してインスタンスを作成する場合、シリアライザーをキャッシュして再利用することが非常に重要です。そうしないと、シリアライザーごとにメモリ内アセンブリが生成されます。これは次のとおりです。パフォーマンスのためですが、b:深刻なメモリリークが発生します(アセンブリをアンロードできません)。

于 2012-11-14T11:03:40.290 に答える