将接口类型对象保存到IsolatedStorageSettings,序列化

时间:2014-10-24 17:26:36

标签: c# windows-phone-8 serialization interface isolatedstorage

我需要将实现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的正确方法吗?

1 个答案:

答案 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