0

我有一个页面,用户可以在其中输入他的姓名并附上图片。

从墓碑状态返回时,我的应用程序是否也必须恢复图像?

  1. 是否是应用程序认证要求,没有它我的应用程序将无法通过认证?还是推荐的模式?

  2. 例如,当我有一个枢轴时,同样的问题是,是否必须保存选定枢轴项的索引并在从墓碑激活时恢复选择?

没有必要:是否有流行的库\框架来帮助我对对象、图像等进行墓碑化和序列化?

4

1 回答 1

0

根据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);
        }
    }
}
于 2013-02-25T16:00:22.287 回答