在哪里放置序列化自定义类的功能

本文关键字:功能 自定义 序列化 在哪里 | 更新日期: 2023-09-27 18:04:37

我现在开始使用序列化,我想我得到了我的类serializable在这里询问后。

现在我想知道将序列化方法放在上述类的中是否被认为是一种好,坏,取决于或无关紧要的设计。

假设我的类是这样的。

[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来实现这些,使用和某种文件阅读器来实现,并且只指定路径。这可行吗?推荐吗?常见的吗?(我从来没有使用过我自己实现的序列化,所以如果这个问题看起来很奇怪,请原谅我。)

在哪里放置序列化自定义类的功能

因为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;
    }

我看过这两种实现,我只能说这取决于具体情况。

在某些情况下这样做是很好的-

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

然而,在许多其他情况下,序列化/反序列化发生在通过http等通道传输时。在这种情况下,要序列化的对象大多是DTO。这就是@Oliver的泛型实现派上用场的地方,在这种情况下,我希望保持DTO的序列化逻辑,使其泛型。

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);
        }
    }
}