在WP 7中序列化数据时出现问题

时间:2012-10-09 12:09:27

标签: c# windows-phone-7 serialization

我有一个需要序列化并存储在Isolated StorageSettings(wp7)中的自定义子类。我有需要序列化的子类,并且该类扩展了它的基类所以我在序列化这两个类,在序列化类时,我我正在使用[DataContract]对变量进行classname和[DataMember],同时我将所有变量公之于众,当我尝试在IsolatedStorageSettings中保存数据时,我得到了例外

  

数据合约类型XXXx不可序列化,因为它不公开。将类型设为公开将修复此错误。

所以我用谷歌搜索并转向添加组件的概念,如

  

[assembly:System.Runtime.CompilerServices.InternalsVisibleTo(“System.Runtime.Serialization”)]

在我的类文件中,最后数据对象被保存,但是当停用应用程序时,数据保存没有错误,当激活应用程序时,我得到了对象,但是我恢复的对象中的变量是空状态回来,我想获取变量及其值。我错过了导致我保存的Object中的变量为null的任何内容吗?

我在下面更新代码

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

using Microsoft.Phone.Controls;

using System.Diagnostics;
using System.Runtime.Serialization;
using System.ComponentModel;

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Runtime.Serialization")]

namespace MyApp.Data
{

    [DataContract]
    public class MyDetail : MyDataSet,INotifyPropertyChanged
    {


        public MyDetail (String data)
        {

            ParseResponse(data);
        }

        public MiniStatementDetail(PhoneApplicationPage context)
        {
            _context = context;
        }
        public void performServerRequest(String mobno, String custno, String uid, String AccNo)
        {

            myProtocol request = this.getProtocol(4);               //Pass Service ID
            request.Parameters.append("mobno", mobno);
            request.Parameters.append("custno", custno);
            request.Parameters.append("uid", uid);
            request.Parameters.append("AccNo", AccNo);

            request.Submit();
        }

        public override void ResponseReceived(String response)
        {
           //         
            MyDetail data = new MyDetail (response);
            ResponseReceived(data);
        }



    public event PropertyChangedEventHandler PropertyChanged;
    public void NotifyPropertyChanged(string propName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(
                this,
                new PropertyChangedEventArgs(propName));
        }
    }
    }
}

和我在下面添加的子类

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.Generic;
using MyApp.Lib;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using System.Diagnostics;
using MyApp;

using System.Xml.Serialization;//--Added for testing Purpose -Rakesh (10/4/2012)
using System.Runtime.Serialization;
using System.ComponentModel;//--Added for testing Purpose -Rakesh (10/4/2012)

using MyApp.config;

//[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Runtime.Serialization")]

namespace MyApp.data
{
    [DataContract]//--Added for testing Purpose -Rakesh (10/4/2012)
    public class MyDataSet : INotifyPropertyChanged
    {

        [DataMember]
        public List<String[]> _data;
        [DataMember]
        public String[] headers;
        [DataMember]
        public String[] headersAr;
        [DataMember]
        public NameValueCollection _params;
        [DataMember]
        public NameValuePair _params1;
        [DataMember]
        public String _status;
        [DataMember]
        public String _refno;
        [DataMember]
        public String _ptoken;
        [DataMember]
        public String _acid;
        [DataMember]
        public String _branchid;
        [DataMember]
        public String _applicationid;
        [DataMember]
        public String _statusDesc;
        [DataMember]
        public const String HEADER_SEPARATOR = ",";
        [DataMember]
        public const char HEADER_SEPARATOR_SEMI = ';';
        [DataMember]
        public const String ROW_SEPARATOR = "@";

        public event EventHandler OnRequestCompleted;
        [DataMember]
        public PhoneApplicationPage _context;
        [DataMember]
        public NameValueCollection _servicevalues;
        [DataMember]
        public List<String[]> parseddemo;


        public List<String[]> getDataRows()
        {
            return _data;
        }

        public String[] getDataRow(int index)
        {
            return (String[])_data[index];
        }

        public String getToken() { return _ptoken; }

        public String getStatus() { return _status; }


        public String getRefNo() { return _refno; }


        public String[] getHeaders() { return headers; }


        public String getAccountID() { return _acid; }

        public String getApplicationID() { return _applicationid; }

        public String getStatusDesc() { return _statusDesc; }


        public String getHeader(int headerConstant)
        {
            return headers[headerConstant];
        }

        public void ParseResponse(String response)
        {
            App.endResponse = response;
            Debug.WriteLine("Parse Response >>>" + response + "::>>::");
             if (_status.Equals("200"))
            {
                //Common.DisplayAlert(_params.getValueByName("error"));
                LoggedUser.doLogout();
                _context.NavigationService.Navigate(new Uri("/Design/LoginLanding.xaml", UriKind.RelativeOrAbsolute));
                return;
            }
            _statusDesc = _params.getValueByName("StatusDesc");
            _refno = _params.getValueByName("refno");
            _ptoken = _params.getValueByName("ptoken");
            _acid = _params.getValueByName("acid");
            _branchid = _params.getValueByName("branchid");
            _applicationid = _params.getValueByName("ApplicationId");
            _data = ParseResponse(response, "Stmt");



        }

        public List<String[]> ParseResponse(String response, String param)
        {
            List<String[]> data = new List<String[]>();
            String paramValue = _params.getValueByName(param);
            if (!String.IsNullOrEmpty(paramValue))
            {
                String[] dataRows = paramValue.Split(ROW_SEPARATOR.ToCharArray()[0]);
                for (int i = 0; i < dataRows.Length; i++)
                {
                    data.Add(dataRows[i].Split(';'));
                }
            }
            return data;
        }






        public List<String[]> getParamValueBasedData(String paramValue)
        {
            List<String[]> data = new List<String[]>();
            if (paramValue == null) paramValue = "";
            if (!String.IsNullOrEmpty(paramValue))
            {
                String[] dataRows = paramValue.Split(ROW_SEPARATOR.ToCharArray()[0]);
                for (int i = 0; i < dataRows.Length; i++)
                {
                    data.Add(dataRows[i].Split(';'));
                }
            }
            return data;
        }

        public String[] getColumArray(int colid, String firstOption)
        {
            return getColumArray(_data, colid, firstOption);
        }

        public String[] getColumArray(int colid)
        {
            return getColumArray(_data, colid);
        }

        public String[] getColumArray(List<String[]> data, int colid)
        {
            String[] retValues = new String[data.Count];
            for (int i = 0; i < data.Count; i++)
            {
                retValues[i] = ((String[])data[i])[colid];
            }
            return retValues;
        }

        public String[] getColumArray(List<String[]> data, int colid, String firstOption)
        {
            String[] retValues = new String[data.Count + 1];
            retValues[0] = firstOption;
            for (int i = 0; i < data.Count; i++)
            {
                retValues[i + 1] = ((String[])data[i])[colid];
            }
            return retValues;
        }

        public String getParam(String name)
        {
            return _params.getValueByName(name);
        }

        public void OnServerResponse(object sender, EventArgs e)
        {
            myProtocol request = (myProtocol)sender;
            Debug.WriteLine("OnServerResponse::MBDataSet:" + request.Response);
            ResponseReceived(request.Response);
        }

        public myProtocol getmyProtocol(int serviceId)
        {
            myProtocol request = new myProtocol(serviceId);
            request.OnRequestCompleted += new EventHandler(OnServerResponse);
            return request;
        }

        public virtual void ResponseReceived(String response)
        {
        }

        {
            if (OnRequestCompleted != null)
            {
                OnRequestCompleted.Invoke(data, EventArgs.Empty);
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        public void NotifyPropertyChanged(string propName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(
                    this,
                    new PropertyChangedEventArgs(propName));
            }
        }
    }

}

并忘记提及保存和恢复过程。我将mycustom对象保存为

var settings = IsolatedStorageSettings.ApplicationSettings;

            if (settings.Contains("SimpleData"))
            {
                settings["SimpleData"] = requiredObj
            }
            else
            {
                settings.Add("SimpleData", requiredObj);

            }

我将恢复为

以下的gn
  try
           {
               var settings = IsolatedStorageSettings.ApplicationSettings;
               MyDetail demoObj= null;
               if (settings.Contains("SimpleData"))
               {
                   Debug.WriteLine("Data Present");
                   settings.TryGetValue<MyDetail >("SimpleData", out demoObj)
                   requiredObj= demoobj;

               }
               else
               {
                   Debug.WriteLine("Data Absent");
               }

           }
           catch (Exception ex)
           {
               Debug.WriteLine("Exception while retreving datas" + ex);
           }

问题的形象如下 enter image description here

2 个答案:

答案 0 :(得分:0)

您是否看过以下“序列化指南”? http://msdn.microsoft.com/en-us/library/6exf3h2k.aspx

属性是否已指定为公开? 它包含:“1.CONSIDER标记您的类型公共的数据成员,如果类型可以用于部分信任。完全信任,数据合同序列化程序可以序列化和反序列化非公共类型和成员,但只公开成员可以部分信任地序列化和反序列化。“

否则粘贴代码,我们可能会找到答案。此外, DEBUG 是最好的,并检查您是否真的存储并从IsolatedStorage获取一些数据?

答案 1 :(得分:0)

对任何可以提供帮助的人(请参阅SecurityException when serializing with DataContractSerializerhttp://systemmetaphor.blogspot.fr/2010/04/silverlight-serialization-avoiding.html

[assembly: InternalsVisibleTo("System.Runtime.Serialization, PublicKey="
+ "00240000048000009400000006020000002400005253413100040000010001008D56C76F9E86493"
+ "83049F383C44BE0EC204181822A6C31CF5EB7EF486944D032188EA1D3920763712CCB12D75FB77E"
+ "9811149E6148E5D32FBAAB37611C1878DDC19E20EF135D0CB2CFF2BFEC3D115810C3D9069638FE4"
+ "BE215DBF795861920E5AB6F7DB2E2CEEF136AC23D5DD2BF031700AEC232F6C6B1C785B4305C123B"
+ "37AB")]
[assembly: InternalsVisibleTo("System.ServiceModel.Web, PublicKey="
+ "00240000048000009400000006020000002400005253413100040000010001008D56C76F9E86493"
+ "83049F383C44BE0EC204181822A6C31CF5EB7EF486944D032188EA1D3920763712CCB12D75FB77E"
+ "9811149E6148E5D32FBAAB37611C1878DDC19E20EF135D0CB2CFF2BFEC3D115810C3D9069638FE4"
+ "BE215DBF795861920E5AB6F7DB2E2CEEF136AC23D5DD2BF031700AEC232F6C6B1C785B4305C123B"
+ "37AB")]
[assembly: InternalsVisibleTo("System.Runtime.Serialization.Json, PublicKey="
+ "00240000048000009400000006020000002400005253413100040000010001008D56C76F9E86493"
+ "83049F383C44BE0EC204181822A6C31CF5EB7EF486944D032188EA1D3920763712CCB12D75FB77E"
+ "9811149E6148E5D32FBAAB37611C1878DDC19E20EF135D0CB2CFF2BFEC3D115810C3D9069638FE4"
+ "BE215DBF795861920E5AB6F7DB2E2CEEF136AC23D5DD2BF031700AEC232F6C6B1C785B4305C123B"
+ "37AB")]