0

後で取得できるように、ac#.NETクラスのインスタンスをSQLに保存したいと思います。LINQ to SQLを使用して、クラスを構成するすべてのxmlを含むレコードを追加できます。

では、そのxmlを取得して、クラスオブジェクトインスタンスを再構築するにはどうすればよいですか?

4

4 に答える 4

6

オブジェクトをXML文字列にシリアル化します。

    public static string ToXml<T>(T obj)
    {
        XmlWriterSettings settings = new XmlWriterSettings();

        settings.OmitXmlDeclaration = true;
        using (Stream stream = new MemoryStream())
        using (XmlWriter writer = XmlWriter.Create(stream, settings))
        {
            new XmlSerializer(obj.GetType()).Serialize(writer, obj);
            writer.Flush();
            stream.Flush();
            stream.Position = 0;
            using (TextReader reader = new StreamReader(stream))
            {
                return reader.ReadToEnd();
            }
        }
    }

XML文字列をオブジェクトに逆シリアル化します。

    public static T FromXml<T>(string xml)
    {
        using (TextReader reader = new StringReader(xml))
        {
            try
            {
                return (T)new XmlSerializer(typeof(T)).Deserialize(reader);
            }
            catch (InvalidOperationException)
            {
                // string passed is not XML, return default
                return default(T);
            }
        }
    }
于 2010-06-09T19:35:46.113 に答える
2

他の人が言及しているように、シリアル化でうまくいきますが、フォーマッター/シリアライザーに注意してください。そうでない場合は、次のようになります。

<?xml version="1.0" encoding="utf-8" ?>

シリアル化の一部になります。可能な限り、DataContractSerializerを使用してください。

何かをする前に、<?xml>テキスト宣言なしの.NETXMLシリアル化を確認することを強くお勧めします。

HTH

于 2010-06-09T19:39:07.013 に答える
0

xmlのシリアル化と逆シリアル化をお勧めします。

次のように定義されたクラスPersonがある場合:

public class Person
{
    public int ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime DateOfBirth { get; set; }
}

保存/XMLからのロードは次のように簡単です。

Person donald = new Person{
                ID=1, 
                FirstName="Donald", 
                LastName="Duck", 
                DateOfBirth=new DateTime(1950,1,1)};

//create a xml serializer with the required type
XmlSerializer xs=new XmlSerializer(typeof(Person));

//open a stream to the file, and save the instance
TextWriter tw = new StreamWriter(@"C:\donald.xml");
xs.Serialize(tw, donald);
tw.Close();

//open a reader stream to the file, and just load the instance.
TextReader tr = new StreamReader(@"C:\donald.xml");
Person donald2 = (Person) xs.Deserialize(tr);
tr.Close();

警告:これにより、クラスのパブリックプロパティ/フィールドのみがXML要素として保存されます。生成されたXMLに対して追加の制御を実行する場合は、System.Xml.Serialization名前空間の属性を確認してください(XmlAttributeAttributeは私の個人的なお気に入りです)。

于 2010-06-09T19:29:54.913 に答える
0

XStreamを使用してオブジェクトをXMLとして保存することをお勧めします。使い方はとても簡単です。

于 2010-06-09T19:32:41.240 に答える