- 乃愛
- 会議室デビュー日: 2006/07/10
- 投稿数: 7
|
投稿日時: 2006-08-23 19:50
XmlSerializeのメソッドを使用してシリアライズ/デシリアライズを行っております。
xmlに対応するクラスを作成しシリアライズできることを確認しました。
デシリアライズでつまずいております。
実行が失敗するわけではありません。
xmlに対応するクラス内にArrayListがあるのですが、
デシリアライズ後の変数を確認するとLength=0ということでデータを取得する事ができません。
もともとのデータが存在しないというわけでもありません。
アドバイスの程、よろしくお願いします。
クラス
コード: |
|
Public Class xmlClass
' コンストラクタ
Public Sub New()
Me.objDetails = New ArrayList
End Sub
' メンバ
Private strName As String
Private objDetails As ArrayList
' プロパティ
<XmlElement()> _
Public Property Name() As String
Get
Return Me.strName
End Get
Set(ByVal Value As String)
Me.strName = Value
End Set
End Property
<XmlArrayItem([Type]:=GetType(objA)), _
XmlArrayItem([Type]:=GetType(objB))> _
Public Property Details() As ArrayList
Get
Return Me.objDetails
End Get
Set(ByVal Value As ArrayList)
Me.objDetails = Value
End Set
End Property
End Class
|
デシリアライズ
コード: |
|
Dim fileName As String = "c:\sample.xml"
Dim serialize As New XmlSerializer(GetType(xmlClass))
Dim fs As New FileStream(fileName, FileMode.Open)
Dim sample As xmlClass
Try
sample = CType(serialize.Deserialize(fs), xmlClass)
Catch ex As Exception
Debug.WriteLine(ex.Message)
Finally
fs.Close()
End Try
|
|
- Ahf
- 大ベテラン
- 会議室デビュー日: 2006/08/16
- 投稿数: 172
|
投稿日時: 2006-08-24 12:24
XmlSerializerクラスのインスタンスを生成する際に、
対象となるArrayListに含まれるクラス(objAとobjBのクラス)を
指定する必要があるかと思います。
実際には
Dim serialize As New XmlSerializer(GetType(xmlClass))
において、第2引数としてobjAとobjBのTypeを収納した配列を
指定してあげれば大丈夫かと思います。
Dim serialize As New XmlSerializer(GetType(xmlClass), [配列])
このような感じでしょうか。
|
- Jitta
- ぬし
- 会議室デビュー日: 2002/07/05
- 投稿数: 6267
- お住まい・勤務地: 兵庫県・海手
|
投稿日時: 2006-08-24 21:54
XmlArrayAttribute 属性の指定が足りないだけのような気がします。
また、ArrayList なので、Set アクセッサは要らないと思います。
ところで、シリアライズしたファイルの中に、対象のオブジェクト配列が含まれていることは、確認してありますか?
|
- 乃愛
- 会議室デビュー日: 2006/07/10
- 投稿数: 7
|
投稿日時: 2006-08-25 10:54
引用: |
| Dim serialize As New XmlSerializer(GetType(xmlClass), [配列])
|
してみましたが、結果に変わりはありませんでした。
引用: |
| ところで、シリアライズしたファイルの中に、対象のオブジェクト配列が含まれていることは、確認してありますか?
|
はい、してあります。
XmlArrayAttributeについて再度見直してみます。
シリアライズして作成されたファイルをデシリアライズしても該当箇所のみnothingになってました。
|