我需要将实现IAnimal接口的列表对象存储到Windows Phone 8 IsolatedStorageSettings.ApplicationSettings。
我的动物界面如下所示:
public interface IAnimal
{
string Name { get; }
}
然后我想把不同的动物存放到IsolatedStorageSettings.ApplicationSettings。
public class Cat : IAnimal
{
string Name { get; set; }
}
public class Dog: IAnimal
{
string Name { get; set; }
}
我有获取/设置动物名单的方法。
public IReadOnlyCollection<IAnimal> GetAnimals()
{
return (List<IAnimal>)storage["animals"];
}
public void AddAnimal(IAnimal animal)
{
List<IAnimal> animals = (List<IAnimal>)storage["animals"];
animals.Insert(0, (IAnimal)animal);
this.storage["animals"] = animals;
this.storage.Save();
}
如果我使用这些方法,我将获得System.Runtime.Serialization.SerializationException,元素“http://schemas.microsoft.com/2003/10/Serialization/Arrays:anyType”包含“http://schemas.datacontract.org/2004/07/MyApp.Models:Cat”数据合约的数据。反序列化器不知道映射到此合同的任何类型。将与“Cat”对应的类型添加到已知类型列表中 - 例如,使用KnownTypeAttribute属性或将其添加到传递给DataContractSerializer的已知类型列表中。
我还试图为Cat和Dog添加KnownType属性,但没有成功。
当我只知道对象实现某个接口时,这是将对象存储到IsolatedStorageSettings的正确方法吗?
答案 0 :(得分:0)
我怀疑您将KnownType属性放在错误的位置。当我使用它时,我总是将它添加到基类中。
示例:
public interface IAnimal
{
string Name { get; }
}
[KnownType(typeof(Cat))]
[KnownType(typeof(Dog))]
public class Animal: IAnimal
{
string Name { get; }
}
public class Cat : Animal
{
string Name { get; set; }
}
public class Dog: Animal
{
string Name { get; set; }
}
http://msdn.microsoft.com/en-us/library/ms751512(v=vs.110).aspx