none
List(Of Point3D)形式のデシリアライズで発生する例外 RRS feed

  • 質問

  • List(Of Point3D)形式の配列の逆シリアル化ができません。
    例外のメッセージの意味が分からず、対処できません。
    どうしたら正常に処理できますか。


    ↓このメソッドは正常に処理される
       Private Sub BT_save_Click(sender As Object, e As RoutedEventArgs) Handles BT_save.Click
            '保存先のファイル名
            Dim fileName As String = "C:\1.xml"
            Dim arr1 = New List(Of Point3D)

            arr1.Add(New Point3D(0, 0, 0))
            arr1.Add(New Point3D(-1, 0, -3))

            Dim serializer As New System.Xml.Serialization.XmlSerializer(
                GetType(List(Of Point3D)))
            Dim sw As New System.IO.StreamWriter(
                fileName, False, New System.Text.UTF8Encoding(False))
            'シリアル化し、XMLファイルに保存する
            serializer.Serialize(sw, arr1)
            sw.Close()

        End Sub


    ’例外が発生するメソッド
      Private Sub BT_load_Click(sender As Object, e As RoutedEventArgs) Handles BT_load.Click
            Dim fileName As String = "C:\1.xml"

            Dim serializer As New DataContractSerializer(GetType(List(Of Point3D)))

            Dim xr As XmlReader = XmlReader.Create(fileName)
            '逆シリアル化
    ’↓この下の行で例外発生
            Dim arr1 = DirectCast(serializer.ReadObject(xr), List(Of Point3D))
            xr.Close()

            Stop
        End Sub

    例外の内容
    System.Runtime.Serialization.SerializationException
      HResult=0x8013150C
      Message=2 行目の位置 2 にエラーがあります。 名前空間 'http://schemas.datacontract.org/2004/07/System.Windows.Media.Media3D' の要素 'ArrayOfPoint3D' を指定してください。。名前が 'ArrayOfPoint3D'、名前空間が '' の 'Element' が検出されました。


     "C:\1.xml"の内容
    <?xml version="1.0" encoding="utf-8"?>
    <ArrayOfPoint3D xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Point3D>
        <X>0</X>
        <Y>0</Y>
        <Z>0</Z>
      </Point3D>
      <Point3D>
        <X>-1</X>
        <Y>0</Y>
        <Z>-3</Z>
      </Point3D>
    </ArrayOfPoint3D>



    2020年12月10日 7:58

回答

  • ひょっとして、XmlSerializerでシリアライズしたXMLをDataContractSerializerでデシリアライズしようとしていませんか?

    使用するシリアライザは統一する必要があります。

    • 回答の候補に設定 ShiroYuki_Mot 2020年12月12日 9:40
    • 回答としてマーク huahi11112 2020年12月14日 8:19
    2020年12月10日 8:12

すべての返信

  • ひょっとして、XmlSerializerでシリアライズしたXMLをDataContractSerializerでデシリアライズしようとしていませんか?

    使用するシリアライザは統一する必要があります。

    • 回答の候補に設定 ShiroYuki_Mot 2020年12月12日 9:40
    • 回答としてマーク huahi11112 2020年12月14日 8:19
    2020年12月10日 8:12
  • シリアライザーを統一したら動作しました。

    ネットに掲載されていたサンプルコードを使ったものですが、他の配列要素では今まで正常に動作していたので気に掛けていませんでした。

    御回答ありがとうございました。

    2020年12月10日 8:29
  • huahi11112さん、こんにちは。フォーラムオペレーターのKumoです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    本件、Hongliangさんより参考になる投稿が寄せられたようでなによりです。

    [回答としてマーク]機能は設定された投稿が後から参照しやすくなりますので、
    同じ問題でお困りの方のためにも参考になった投稿に設定いただけますと幸いです。

    お手数ですが、ご協力の程どうかよろしくお願いいたします。

    引き続きMSDNフォーラムをご利用いただけますようお願い申し上げます。

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2020年12月14日 7:54
    モデレータ