C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: Xmlシリアル化について


(過去ログ 77 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■45731 / inTopicNo.1)  Xmlシリアル化について
  
□投稿者/ aetos (213回)-(2010/01/19(Tue) 13:24:59)

分類:[.NET 全般] 

VS2008 C#です。
XmlSerializer で以下のようなシリアライズは可能なんでしょうか?
「IXmlSerializable を実装すればできるよ」以外でお願いします。

1:
public struct People
{
    public string[] Person;
}

という型を

<People>
    <Person Name="Hoge"/>
    <Person Name="Hage"/>
    <Person Name="Hige"/>
</People>

とシリアライズする。

2:
public struct Data
{
    public int Value;
}

public struct Hoge
{
    public Data Data;
}

という型を

<Hoge Data="100"/> <!-- 100 は Data.Value の値 -->

とシリアライズする。

3:
public struct Data
{
    [DefaultValue(100)]
    public int Value;
}

public struct Hoge
{
    public Data Data;
}

という型で、Data.Value が 100 のとき、Hoge 自体をシリアライズしない(<Hoge/> と出さない)。

引用返信 編集キー/
■45736 / inTopicNo.2)  Re[1]: Xmlシリアル化について
□投稿者/ Hongliang (545回)-(2010/01/19(Tue) 15:09:37)
1 は XmlElement 属性を使えば可能です。
2, 3 は多分無理。

シリアライザはシリアライザなので、基本的には永続化できればそれで十分なはずである、ということでしょう。
引用返信 編集キー/
■45746 / inTopicNo.3)  Re[2]: Xmlシリアル化について
□投稿者/ aetos (214回)-(2010/01/19(Tue) 16:29:54)
No45736 (Hongliang さん) に返信
> 1 は XmlElement 属性を使えば可能です。
> 2, 3 は多分無理。
>
> シリアライザはシリアライザなので、基本的には永続化できればそれで十分なはずである、ということでしょう。

ありがとうございます。
1 のやり方を教えていただけませんか。

[XmlElement]
public string[] Person;

では、

<Person>Hoge</Person>
<Person>Hage</Person>
<Person>Hige</Person>

になってしまいます。

[XmlElement, XmlAttribute("Name")]

にすると例外が出ます。
引用返信 編集キー/
■45747 / inTopicNo.4)  Re[2]: Xmlシリアル化について
□投稿者/ れい (864回)-(2010/01/19(Tue) 16:31:59)
No45736 (Hongliang さん) に返信
> 1 は XmlElement 属性を使えば可能です。
> 2, 3 は多分無理。
> 
> シリアライザはシリアライザなので、基本的には永続化できればそれで十分なはずである、ということでしょう。


なんかずるいけどこんなのはだめでしょうか?


    Public Structure Data2
        Public value As Integer
    End Structure

    Public Structure Data3
        <DefaultValue(0)> _
        Public value As Integer
    End Structure

    Public Class Data1
        <XmlIgnore()> Public data2 As Data2
        <Browsable(False), XmlAttribute("Data2")> Public Property Data2ForSerialize() As Integer
            Get
                Return data2.value
            End Get
            Set(ByVal value As Integer)
                data2.value = value
            End Set
        End Property

        <XmlIgnore()> Public data3 As Data3
        <Browsable(False), XmlElement("Data3")> Public Property Data3ForSerialize() As String
            Get
                If data3.value = 0 Then Return Nothing
                Return data3.value.ToString
            End Get
            Set(ByVal value As String)
                data3.value = Integer.Parse(value)
            End Set
        End Property

    End Class


関係ないですが、structのときはDefaultValueによる初期化をいつどうやっていいのかわかりません…

引用返信 編集キー/
■45749 / inTopicNo.5)  Re[3]: Xmlシリアル化について
□投稿者/ aetos (215回)-(2010/01/19(Tue) 16:47:58)
No45747 (れい さん) に返信

> なんかずるいけどこんなのはだめでしょうか?

なるほどー。
ただ、楽をしたいがための XmlSerializer なので、いささか面倒ではありますね。
今は XLinq でゴリゴリと struct に読み込んでいるのですが、いい勝負のような気はします。

> 関係ないですが、structのときはDefaultValueによる初期化をいつどうやっていいのかわかりません…

あー、Xml 中に要素がなかったら DefaultValue を入れてくれるところまでは気が利かないんですね。
引用返信 編集キー/
■45750 / inTopicNo.6)  Re[3]: Xmlシリアル化について
□投稿者/ Hongliang (546回)-(2010/01/19(Tue) 16:51:01)
> 1 のやり方を教えていただけませんか。
>
> [XmlElement]
> public string[] Person;
>
> では、
>
> <Person>Hoge</Person>
> <Person>Hage</Person>
> <Person>Hige</Person>
>
> になってしまいます。

あ、すいません、見落としていました。
属性ですか。なら無理でしょう。
引用返信 編集キー/
■45751 / inTopicNo.7)  Re[4]: Xmlシリアル化について
□投稿者/ aetos (216回)-(2010/01/19(Tue) 16:56:21)
No45750 (Hongliang さん) に返信

> 属性ですか。なら無理でしょう。

やっぱりそうですか。ありがとうございました。
解決済み
引用返信 編集キー/
■45754 / inTopicNo.8)  Re[4]: Xmlシリアル化について
□投稿者/ Hongliang (547回)-(2010/01/19(Tue) 17:04:57)
> ただ、楽をしたいがための XmlSerializer なので、いささか面倒ではありますね。

先ほども言いましたけど、XmlSerializer はシリアライザです。ですのでオブジェクトの永続化には便利です。
しかし XmlSerializer はオブジェクト/XML マッパーではありません。既存の XML をオブジェクトに読み込む用途に使うものではありません。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -