我有一个Windows应用商店应用。我试图在系统暂停和关闭时保存状态。我正在序列化由实体框架6生成的估计对象。它具有子实体,它们存储在估计实体中的DataServiceCollections中。当我反序列化它时,我收到以下错误:
无法将项目添加到集合中。当DataServiceContext跟踪DataServiceCollection中的项时,在将项加载到集合之前,不能添加新项。
我正在使用的序列化功能是:
public static string SerializeObject(object obj)
{
MemoryStream stream = new MemoryStream();
System.Runtime.Serialization.Json.DataContractJsonSerializer ser = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType(), Common.SuspensionManager.KnownTypes);
ser.WriteObject(stream, obj);
byte[] data = new byte[stream.Length];
stream.Seek(0, SeekOrigin.Begin);
stream.Read(data, 0, data.Length);
return Convert.ToBase64String(data);
}
public static T DeserializeObject<T>(string input)
{
System.Runtime.Serialization.Json.DataContractJsonSerializer ser = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T));
MemoryStream stream = new MemoryStream(Convert.FromBase64String(input));
return (T)ser.ReadObject(stream);
}
对这些功能的调用如下:
在保存状态下序列化:
e.PageState["SelectedEstimate"] = StringSerializer.SerializeObject(Est);
在恢复状态中反序列化:
Est = StringSerializer.DeserializeObject<Estimate>((string)e.PageState["SelectedEstimate"]);
是否有更好的序列化方法可以与EF实体一起使用?任何帮助将不胜感激。
吉姆
答案 0 :(得分:0)
这是一段时间后发布的,但我觉得它值得回答。答案是不使用Entity Framework,只创建自己的实体。我使用ObservableCollections作为我实体的子成员。 EF为你做的一件事是跟踪状态。您可以通过在WCF接口定义中添加枚举来自己完成此操作:
[DataContract(Name = "RecordState")]
public enum CustomerRecordStateEnum
{
[EnumMember]
Unchanged = 0,
[EnumMember]
Added = 1,
[EnumMember]
Modified = 2,
[EnumMember]
Deleted = 3
}
然后在Customer或任何具有RecordState属性的对象中。
[DataMember]
public Nullable<CustomerRecordStateEnum> RecordState { get; set; }
在生成对象的WCF中,将其初始化为未更改。在您的客户端中,生成的对象将实现IPropertyChanged。您可以挂钩并将状态设置为已修改。如果没有其他任何操作,你只想这样做。如果已添加或删除它并将状态更改为已修改,则事情会变得混乱:
void Cust_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName != "RecordState")
{
if (Cust.RecordState == RecordState.Unchanged)
Cust.RecordState = RecordState.Modified;
}
}
创建类Cust后使用:
Cust.PropertyChanged += Cust_PropertyChanged;
唯一要记住的是,如果从您的应用程序更新对象(在本例中为Cust),请确保将RecordState设置回RecordState.Unchanged。
这一点的重点在于,使用此场景,您可以创建跟踪其记录状态的实体,并在需要保存暂停状态或其他情况时序列化它们。他们将反序列化就好了。这样,在简历上,您不会从服务中加载它们。从服务中加载它们会覆盖您在本地所做的任何更改,但尚未保存。
希望这对某人有用。
吉姆