我有一个页面,用户可以在其中输入他的姓名并附上图片。
从墓碑状态返回时,我的应用程序是否也必须恢复图像?
是否是应用程序认证要求,没有它我的应用程序将无法通过认证?还是推荐的模式?
例如,当我有一个枢轴时,同样的问题是,是否必须保存选定枢轴项的索引并在从墓碑激活时恢复选择?
没有必要:是否有流行的库\框架来帮助我对对象、图像等进行墓碑化和序列化?
我有一个页面,用户可以在其中输入他的姓名并附上图片。
从墓碑状态返回时,我的应用程序是否也必须恢复图像?
是否是应用程序认证要求,没有它我的应用程序将无法通过认证?还是推荐的模式?
例如,当我有一个枢轴时,同样的问题是,是否必须保存选定枢轴项的索引并在从墓碑激活时恢复选择?
没有必要:是否有流行的库\框架来帮助我对对象、图像等进行墓碑化和序列化?
根据Windows Phone 的技术认证要求,唯一的要求是:
当用户按下“开始”按钮或设备超时导致锁定屏幕启动时,Windows Phone 应用程序将被停用。Windows Phone 应用程序也会因调用 Launcher 或 Chooser API 而被停用。
Windows Phone OS 7.0 应用程序在停用时会被删除(终止)。Windows Phone OS 7.1 或更高版本的应用程序在停用时变为休眠状态,但在资源使用策略导致其进入墓碑时可由系统终止。
终止后激活时,应用程序必须满足第 5.2.1 节 - 启动时间中的要求。
由于第 5.2.1 节 - “启动时间”仅涉及启动性能和响应能力,因此您没有针对您的问题的认证要求。
但是,如果用户输入数据(附加图像等)并假设它接听电话,做一些其他事情并返回应用程序,然后他输入的数据丢失了......它肯定不会欣赏它. 这看起来更像是一个缺陷/错误。
关于状态的序列化,我建议您使用二进制序列化,因为性能至少比使用 Json、Xml 或任何其他格式好 10 倍。
就个人而言,我为我的“状态”相关类实现了一个自定义接口 IBinarySerializable,并使用此 BinaryWriter 扩展类来帮助编写序列化代码:
using System.IO;
namespace MyCompany.Utilities
{
public interface IBinarySerializable
{
void Write(BinaryWriter writer);
void Read(BinaryReader reader);
}
}
using System;
using System.Collections.Generic;
using System.IO;
namespace MyCompany.Utilities
{
public static class BinaryWriterExtensions
{
public static void Write<T>(this BinaryWriter writer, T value) where T : IBinarySerializable
{
if (value == null)
{
writer.Write(false);
return;
}
writer.Write(true);
value.Write(writer);
}
public static T Read<T>(this BinaryReader reader) where T : IBinarySerializable, new()
{
if (reader.ReadBoolean())
{
T result = new T();
result.Read(reader);
return result;
}
return default(T);
}
public static void WriteList<T>(this BinaryWriter writer, IList<T> list) where T : IBinarySerializable
{
if (list == null)
{
writer.Write(false);
return;
}
writer.Write(true);
writer.Write(list.Count);
foreach (T item in list)
{
item.Write(writer);
}
}
public static List<T> ReadList<T>(this BinaryReader reader) where T : IBinarySerializable, new()
{
bool hasValue = reader.ReadBoolean();
if (hasValue)
{
int count = reader.ReadInt32();
List<T> list = new List<T>(count);
if (count > 0)
{
for (int i = 0; i < count; i++)
{
T item = new T();
item.Read(reader);
list.Add(item);
}
return list;
}
}
return null;
}
public static void WriteListOfString(this BinaryWriter writer, IList<string> list)
{
if (list == null)
{
writer.Write(false);
return;
}
writer.Write(true);
writer.Write(list.Count);
foreach (string item in list)
{
writer.WriteSafeString(item);
}
}
public static List<string> ReadListOfString(this BinaryReader reader)
{
bool hasValue = reader.ReadBoolean();
if (hasValue)
{
int count = reader.ReadInt32();
List<string> list = new List<string>(count);
if (count > 0)
{
for (int i = 0; i < count; i++)
{
list.Add(reader.ReadSafeString());
}
return list;
}
}
return null;
}
public static void WriteSafeString(this BinaryWriter writer, string value)
{
if (value == null)
{
writer.Write(false);
return;
}
writer.Write(true);
writer.Write(value);
}
public static string ReadSafeString(this BinaryReader reader)
{
bool hasValue = reader.ReadBoolean();
if (hasValue)
return reader.ReadString();
return null;
}
public static void WriteDateTime(this BinaryWriter writer, DateTime value)
{
writer.Write(value.Ticks);
}
public static DateTime ReadDateTime(this BinaryReader reader)
{
var int64 = reader.ReadInt64();
return new DateTime(int64);
}
}
}