0

私は今シリアライゼーションの作業を始めています。ここで質問した後、クラスをシリアライズ可能にしたと思います。

シリアル化メソッドを上記のクラス内に配置することは、良い、悪い、依存する、または無関心な設計と見なされるのでしょうか。

このようなクラスがあるとします。

[XmlRoot("Settings")]
public class SerializableClass
{
  public SerializableClass() { }

  [XmlElement("PropertyOne")]
  public String PropertyString { get; set; }

  [XmlElement("PropertyTwo")]
  public int PropertyInt { get; set; }

  public Object PropertyObject { get; set; }
}

このようなメソッドを追加して、オブジェクト自体を (逆) シリアル化することは理にかなっていますか?

public String SerializeMe()
{
  XmlSerializer serializer = new XmlSerializer(typeof(SerializableClass));
  StringWriter writer = new StringWriter();
  serializer.Serialize(writer, this);
  return writer.ToString();
}

public static SerializableClass DeSerialize(String input)
{
  StringReader reader = new StringReader(input);
  XmlSerializer serializer = new XmlSerializer(SerializableClass);
  return xmlSerializer.Deserialize(reader) as SerializableClass;
}

もちろん、これらをtry-catchで実装し、ある種のファイルリーダーを使用して、パスのみを指定します。それは実行可能ですか?おすすめされた?一般?(私が実装したシリアライゼーションを使用したことがないので、質問が奇妙に思われる場合はご容赦ください。)

4

2 に答える 2

2

XmlSerializerはシリアル化属性を認識するので、コードの重複を防ぐためにジェネリック実装を使用してみませんか?

    public static string Serialize<T>(object item)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(T));
        StringWriter writer = new StringWriter();
        serializer.Serialize(writer, item);
        return writer.ToString();
    }

    public static T DeSerialize<T>(string input) where T : class
    {
        StringReader reader = new StringReader(input);
        XmlSerializer serializer = new XmlSerializer(typeof(T));
        return serializer.Deserialize(reader) as T;
    }
于 2013-03-19T16:10:46.007 に答える
0

私は両方の実装を見てきましたが、状況によるとしか言えません。

場合によってはこれを行うのは素晴らしいことです -

var object = new SerializableClass {PropertyString = "foo", PropertyInt = 22};
var xml = object.Serialize();

ただし、他の多くの場合、シリアライゼーション/デシリアライゼーションは、http などのチャネルを介して転送中に発生します。その場合、シリアル化されるオブジェクトはほとんどが DTO です。これは、@Oliver のジェネリック実装が役立つ場所です。これは、シリアライゼーション ロジックを DTO から除外してジェネリックにしたい場合の 1 つです。

EDIT 1 - シリアライゼーション/デシリアライゼーションが機能するコードを追加する -

スニペットを使用してみましたが、シリアライズ/デシリアライズできました。ただし、いくつかの小さな変更-

using System;
using System.IO;
using System.Xml.Serialization;

using NUnit.Framework;

namespace Serialization
{
    [XmlRoot("Settings")]
    public class SerializableClass
    {
        public SerializableClass() { }

        [XmlElement("PropertyOne")]
        public String PropertyString { get; set; }

        [XmlElement("PropertyTwo")]
        public int PropertyInt { get; set; }

        public Object PropertyObject { get; set; }

        public String SerializeMe()
        {
            var serializer = new XmlSerializer(typeof(SerializableClass));
            var writer = new StringWriter();
            serializer.Serialize(writer, this);
            return writer.ToString();
        }

        public static SerializableClass DeSerialize(String input)
        {
            var reader = new StringReader(input);
            var serializer = new XmlSerializer(typeof(SerializableClass));
            return serializer.Deserialize(reader) as SerializableClass;
        }
    }

    [TestFixture]
    public class SerializerTest
    {
        [Test]
        public void SerializationTest()
        {
            var serializableClass = new SerializableClass { PropertyInt = 23, PropertyString = "foo", PropertyObject = "bar"};
            Console.WriteLine(serializableClass.SerializeMe());
        }

        [Test]
        public void DeserializationTest()
        {
            var deserializedXML = @"<?xml version=""1.0"" encoding=""utf-16:""?>" +
                                    @"<Settings xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"">" +
                                    @"<PropertyOne>foo</PropertyOne><PropertyTwo>23</PropertyTwo><PropertyObject xsi:type=""xsd:string"">bar</PropertyObject></Settings>";
            var serializableClass = SerializableClass.DeSerialize(deserializedXML);
            Console.WriteLine(serializableClass.PropertyInt);
            Console.WriteLine(serializableClass.PropertyString);
            Console.WriteLine(serializableClass.PropertyObject);
        }
    }
}
于 2013-03-19T16:19:24.373 に答える