Проще говоря, вы не можете сериализовать интерфейс без какой-либо грязи. Но почему вы все равно хотите сериализовать свой интерфейс, он не содержит никакого состояния. У него есть только объявление для метода.
Возможно, вы захотите создать метод Serialize внутри ваших классов. Таким образом, они могут сериализовать себя индивидуально, они знают, к какому типу они относятся.
Кроме того, как вы ожидаете, что XmlSerializer будет десериализироваться до точного типа, не предоставляя его? Он не может просто выбрать, что нужно десериализовать ...
Однако вы можете изменить эту строку
IDelivery iD = DeserializeObject<IDelivery>(sb);
к этому
IDelivery iD = DeserializeObject<SccmAction>(sb);
Если вы не знаете, какой тип десериализуете изначально (ArsAction или SccmAction), то вы можете сделать что-то вроде этого.
public static IDelivery DeserializeFromString(string xml)
{
//replace this stream with whatever you are useing
StringReader strReader = new StringReader(xml);
XmlReader reader = new XmlTextReader(fs); //important to use XmlReader
reader.MoveToContent(); //move to root
String className = reader.Name.Trim(); //read the class name
//use the namespace IDelivery is located in
className = "IDeliveryNamespace." + className;
//get the type
Type classType = Type.GetType(className);
XmlSerializer serializer = new XmlSerializer(Type.GetType(className));
// Declare an object variable of the type to be deserialized.
IDelivery i;
// Use the Deserialize method to restore the object's state.
i = (IDelivery)Convert.ChangeType(serializer.Deserialize(reader),classType);
return i;
}
Конечно, это предполагает, что вы не изменили имя вашего сериализуемого класса. Значение класса ArsAction сериализуется и, насколько я могу судить, из того, что вы опубликовали, имеет место.
Этот код немного грязный, но он должен дать вам отправную точку.