【发布时间】:2010-11-11 20:39:02
【问题描述】:
我有两个类 SccmAction 和 TicketAction,它们都实现了接口 IDelivery。这些类将在处理队列中传输,我只想从中提取消息并根据 Deliver 方法采取行动。
但是,我似乎无法反序列化到接口,因为当我尝试这样做时,会抛出 System.NotSupportedException。从我收集的内容来看,XMLSerializer 需要一个具体的序列化类型。这是否让我不得不创建一个实现 IDelivery 并从中继承 SccmAction 和 ArsAction 的抽象类?我错过了什么吗?
编辑进一步说明
我可能有设计缺陷,但我的目的是从包含这些对象的队列中提取消息。我的意图是让所有来自这个队列的对象都实现接口,确保处理对象的应用程序只在 Deliver 方法上运行。 Deliver 的每个对象实现都会有所不同。
反序列化代码
using (SqlConnection connection =
new SqlConnection(ConnectionString))
{
SqlCommand command = new SqlCommand(ReceiveString, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
byte[] sb = (byte[])reader["message_body"];
SccmAction sa = DeserializeObject<SccmAction>(sb);
IDelivery iD = DeserializeObject<IDelivery>(sb);
}
reader.Close();
}
public static T DeserializeObject<T>(byte[] ba)
{
XmlSerializer xs = new XmlSerializer(typeof(T));
MemoryStream memoryStream = new MemoryStream(ba);
XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
return (T)xs.Deserialize(memoryStream);
}
类和接口
[Serializable]
public class SccmAction : IDelivery
{
public string MachineName { get; set; }
public string CollectionName { get; set; }
public string Action { get; set; }
public DateTime EntryDateTime { get; set; }
public SccmAction () { }
public void Deliver()
{
throw new NotImplementedException();
}
}
[Serializable]
public class ArsAction : IDelivery
{
public string MachineName { get; set; }
public string CustomerName { get; set; }
public ArsAction() { }
public void Deliver()
{
throw new NotImplementedException();
}
}
public interface IDelivery
{
void Deliver();
}
【问题讨论】:
-
顺便说一句,XmlSerializer 不需要
[Serializable]类型 - 后者用于二进制序列化。 -
没意识到,谢谢你的提示。
标签: c# serialization interface xml-serialization