我一直在试图解决现在这个愚蠢的问题了几天,它是做我的头,我将非常高兴,是已经有人工作的例子,因为到目前为止,我已经找到了那些没有工作:(我可以。基本序列类型,但没有对象,我在问候了DataContractAttribute很迷茫等我得到的错误是:
预计不会{“类型‘SerializeListWinRT.DataModel.LocalStorage +猫’用数据合同名称‘LocalStorage.Cat:http://schemas.datacontract.org/2004/07/SerializeListWinRT.DataModel’。考虑使用DataContractResolver或增加任何类型不是静态已知的已知类型的列表 - 例如,通过使用KnownTypeAttribute属性或通过将其添加到已知类型传递给DataContractSerializer的列表“}。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.Storage;
using System.IO;
using System.Runtime.Serialization;
using Windows.Storage.Streams;
namespace SerializeListWinRT.DataModel
{
class LocalStorage
{
[DataContractAttribute]
public class Cat
{
[DataMember()]
public String Name { get; set; }
}
static private Dictionary<string, object> _data = new Dictionary<string, object>();
private const string filename = "items.xml";
static public Dictionary<string, object> Data
{
get { return _data; }
}
static public T GetItem<T>(string key)
{
T result = default(T);
if (_data.ContainsKey(key))
{
result = (T)_data[key];
}
return result;
}
static public bool ContainsItem(string key)
{
return _data.ContainsKey(key);
}
static async public Task Save()
{
await Windows.System.Threading.ThreadPool.RunAsync((sender) =>
{
LocalStorage.SaveAsync().Wait();
}, Windows.System.Threading.WorkItemPriority.Normal);
}
static async public Task Restore()
{
await Windows.System.Threading.ThreadPool.RunAsync((sender) =>
{
LocalStorage.RestoreAsync().Wait();
}, Windows.System.Threading.WorkItemPriority.Normal);
}
static async private Task SaveAsync()
{
_data.Add("cat", new Cat { Name = "Myname is" });
_data.Add("dog", new Cat { Name = "Myname is" });
StorageFile sessionFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
IRandomAccessStream sessionRandomAccess = await sessionFile.OpenAsync(FileAccessMode.ReadWrite);
IOutputStream sessionOutputStream = sessionRandomAccess.GetOutputStreamAt(0);
DataContractSerializer sessionSerializer = new DataContractSerializer(typeof(Dictionary<string, object>));
sessionSerializer.WriteObject(sessionOutputStream.AsStreamForWrite(), _data);
await sessionOutputStream.FlushAsync();
}
static async private Task RestoreAsync()
{
StorageFile sessionFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.OpenIfExists);
if (sessionFile == null)
{
return;
}
IInputStream sessionInputStream = await sessionFile.OpenReadAsync();
DataContractSerializer sessionSerializer = new DataContractSerializer(typeof(Dictionary<string, object>));
_data = (Dictionary<string, object>)sessionSerializer.ReadObject(sessionInputStream.AsStreamForRead());
}
}
}
如何我解决了这个问题:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.Storage;
using System.IO;
using System.Runtime.Serialization;
using Windows.Storage.Streams;
namespace SerializeListWinRT.DataModel
{
class LocalStorage
{
[KnownType(typeof(SerializeListWinRT.Cat))]
[DataContractAttribute]
public class Cat
{
[DataMember()]
public String Name { get; set; }
}
static private Dictionary<string, object> _data = new Dictionary<string, object>();
private const string filename = "ngt.xml";
static public Dictionary<string, object> Data
{
get { return _data; }
}
static public T GetItem<T>(string key)
{
T result = default(T);
if (_data.ContainsKey(key))
{
result = (T)_data[key];
}
return result;
}
static public bool ContainsItem(string key)
{
return _data.ContainsKey(key);
}
static async public Task Save<T>()
{
await Windows.System.Threading.ThreadPool.RunAsync((sender) =>
{
LocalStorage.SaveAsync<T>().Wait();
}, Windows.System.Threading.WorkItemPriority.Normal);
}
static async public Task Restore<T>()
{
await Windows.System.Threading.ThreadPool.RunAsync((sender) =>
{
LocalStorage.RestoreAsync<T>().Wait();
}, Windows.System.Threading.WorkItemPriority.Normal);
}
static async private Task SaveAsync<T>()
{
_data.Add("cat", new Cat { Name = "Myname is" });
_data.Add("dog", new Cat { Name = "Myname is" });
StorageFile sessionFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
IRandomAccessStream sessionRandomAccess = await sessionFile.OpenAsync(FileAccessMode.ReadWrite);
IOutputStream sessionOutputStream = sessionRandomAccess.GetOutputStreamAt(0);
DataContractSerializer sessionSerializer = new DataContractSerializer(typeof(Dictionary<string, object>), new Type[] { typeof(T) });
sessionSerializer.WriteObject(sessionOutputStream.AsStreamForWrite(), _data);
await sessionOutputStream.FlushAsync();
}
static async private Task RestoreAsync<T>()
{
StorageFile sessionFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.OpenIfExists);
if (sessionFile == null)
{
return;
}
IInputStream sessionInputStream = await sessionFile.OpenReadAsync();
DataContractSerializer sessionSerializer = new DataContractSerializer(typeof(Dictionary<string, object>), new Type[] { typeof(T) });
_data = (Dictionary<string, object>)sessionSerializer.ReadObject(sessionInputStream.AsStreamForRead());
}
}
}