C# 将接口类型对象保存到IsolatedStorage设置、序列化

C# 将接口类型对象保存到IsolatedStorage设置、序列化,c#,windows-phone-8,serialization,interface,isolatedstorage,C#,Windows Phone 8,Serialization,Interface,Isolatedstorage,我需要存储实现Windows Phone 8 IsolatedStorageSettings.ApplicationSettings IAnimal接口的列表对象 public class Cat : IAnimal { string Name { get; set; } } public class Dog: IAnimal { string Name { get; set; } } 我的动物界面如下所示: public interface IAnimal { s

我需要存储实现Windows Phone 8 IsolatedStorageSettings.ApplicationSettings IAnimal接口的列表对象

public class Cat : IAnimal
{
    string Name { get; set; }
}


public class Dog: IAnimal
{
    string Name { get; set; }
}
我的动物界面如下所示:

public interface IAnimal
{
    string Name { get; }
}
然后我要将不同的动物存储到隔离存储设置。应用程序设置

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,元素包含数据协定的数据。反序列化程序不知道映射到此协定的任何类型。将与“Cat”对应的类型添加到已知类型列表中-例如,使用KnownTypeAttribute属性或将其添加到传递给DataContractSerializer的已知类型列表中

我也尝试过给猫和狗添加KnownType属性,但没有成功


当我只知道对象实现了某些接口时,这是将对象存储到IsolatedStorageSettings的正确方法吗?

我怀疑您将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; }
}

现在我没有任何基类动物,所有不同的动物都直接实现IAnimal接口。但我会像你解释的那样尝试添加基类。你必须记住,接口只是类承诺实现的契约。序列化/反序列化时,实际上是序列化/反序列化类,而不是接口。