【问题标题】:System.Runtime.Serialization.InvalidDataContractException Windows Phone 8System.Runtime.Serialization.InvalidDataContractException Windows Phone 8
【发布时间】:2013-03-28 11:47:03
【问题描述】:

我正在尝试将对象保存到独立存储中,但收到了A first chance exception of type 'System.Runtime.Serialization.InvalidDataContractException' occurred in System.Runtime.Serialization.ni.dll

我的对象类

[DataContract]
public class NoteContent : IEnumerable
{
    [DataMember] 
    public Microsoft.Phone.Controls.SupportedPageOrientation SupportedOrientation{ get; set; }
    [DataMember] 
    public List<Character> NoteCharacterList { get; set; }
    [DataMember] 
    public string NoteFileName { get; set; }

    private List<Character> notecontent = new List<Character>();

    public void Add(Character charObj)
    {
        notecontent.Add(charObj);
        NoteCharacterList = notecontent;
    }

    public void Clear()
    {
        notecontent.Clear();
    }

    public Character this[int id]
    {
        get { return notecontent[id]; }
    }

    public IEnumerator<Character> GetEnumerator()
    {
        return notecontent.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

我用来序列化和保存对象的代码。在这一行引发了错误_mySerializer.WriteObject(targetFile, sourceData);

    public void SaveMyData(NoteContent sourceData, String targetFileName)
    {
        string TargetFileName = String.Format("{0}/{1}.dat", TargetFolderName, targetFileName);

        using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
        {

            if (!store.DirectoryExists(TargetFolderName))
                store.CreateDirectory(TargetFolderName);
            try
            {
                using (var targetFile = store.CreateFile(TargetFileName))
                {
                    _mySerializer.WriteObject(targetFile, sourceData);
                }
            }
            catch (Exception e)
            {
                store.DeleteFile(TargetFileName);
            }
        }

    }

对象包含对象和控件的列表。

要保存的主对象内的对象列表

是因为我无法序列化图像控件和画布控件等对象吗?将此类对象保存到独立存储中的最佳方法是什么?

更新 1

我已将对象简化为仅包含以下属性,但仍然遇到相同的错误。 Points 和 Char 是否可序列化?

    public Point ImagePosition { get; set; }
    public Char CharText { get; set; }
    public double ImageDegree { get; set; }
    public double ImageScale { get; set; }
    public int ImageZOrder { get; set; }
    public bool IsResizeCancel { get; set; }
    public double MaxSliderValue { get; set; }
    public double CurrentWidth { get; set; }
    public double CurrentHeight { get; set; }

【问题讨论】:

  • 你为什么不能这样做?因为您要序列化数据,而不是整个 UI 树。
  • 那么如果我去掉 Canvas 和 Image 控件和复合变换对象,应该没问题吧?
  • 也许 - 这取决于您尝试保存的所有对象是否都是可序列化的。

标签: c# object serialization windows-phone-8


【解决方案1】:

设法解决了它。我通过删除可能无法使用 Copying object to another object but remove certain properties Windows Phone 8 序列化的属性来简化我的对象

简化类

[DataContract]
public class CharacterClone
{
    [DataMember] 
    public Point ImagePosition { get; set; }
    [DataMember] 
    public Char CharText { get; set; }
    [DataMember] 
    public double ImageDegree { get; set; }
    [DataMember] 
    public double ImageScale { get; set; }
    [DataMember] 
    public int ImageZOrder { get; set; }
    [DataMember] 
    public bool IsResizeCancel { get; set; }
    [DataMember] 
    public double MaxSliderValue { get; set; }
    [DataMember] 
    public double CurrentWidth { get; set; }
    [DataMember] 
    public double CurrentHeight { get; set; }

    public CharacterClone(Character original)
    { 
        ImagePosition = original.ImagePosition;
        CharText = original.CharText;
        ImageDegree = original.ImageDegree;
        ImageScale = original.ImageScale;
        ImageZOrder = original.ImageZOrder;
        IsResizeCancel = original.IsResizeCancel;
        MaxSliderValue = original.MaxSliderValue;
        CurrentWidth = original.CurrentWidth;
        CurrentHeight = original.CurrentHeight;
    }
}

另一个需要注意的重要事项是文件路径。在 WP8 中,分隔符应该是 \\ 而不是 / 例如

string TargetFileName = String.Format("{0}\\{1}.dat", TargetFolderName, targetFileName);

【讨论】:

    【解决方案2】:

    我使用这个类并在保存时抛出相同的异常

    System.Runtime.Serialization.ni.dll 中出现“System.Runtime.Serialization.InvalidDataContractException”类型的异常,但未在用户代码中处理

        [DataContract]
    class UserInfo :SerializationException
    {
        //  Constructors: 
        public UserInfo() { }
        public UserInfo(String username,String password) {
            Username = username;
            Password = password;
        }
       [DataMember] 
        public String Username
        {
            get;
            set;
        }
       [DataMember] 
        public String Password
        {
            get;
            set;
        }
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      相关资源
      最近更新 更多