我现在开始使用序列化,我认为在询问here之后我的课程可序列化了。
现在我想知道将序列化方法置于所述类中是否是一种好的,坏的,依赖的或无关紧要的设计。
假设我的班级是这样的。
[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; }
}
添加像这样的方法是否有意义让对象(de)自行序列化?
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 ,使用和某种文件阅读器来实现这些,并且只指定路径。它可行吗?推荐的?共同? (我从未使用过我实现的序列化,所以如果问题看起来很奇怪,请耐心等待。)
答案 0 :(得分: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;
}
答案 1 :(得分:0)
我已经看过两种实现,我只能说它取决于具体情况。
在某些情况下这样做很棒 -
var object = new SerializableClass {PropertyString = "foo", PropertyInt = 22};
var xml = object.Serialize();
然而,在很多其他情况下,序列化/解除序列化在通过像http这样的频道传输时发生。在这种情况下,要序列化的对象主要是DTO。这是@Oliver的通用实现派上用场的地方,这是我希望将序列化逻辑保留在DTO之外的一种情况,以使其成为通用的。
编辑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);
}
}
}