コード例 #1
0
ファイル: WebRequest.cs プロジェクト: Yuu03/UnityFramework
        private void BuildContent <T>(T value)
        {
            if (value == null)
            {
                return;
            }

            byte[] bodyData = null;

            switch (Format)
            {
            case DataFormat.Json:
                var json = JsonFx.Json.JsonWriter.Serialize(value);
                bodyData = Encoding.UTF8.GetBytes(json);
                break;

            case DataFormat.MessagePack:
                MessagePackValidater.ValidateAttribute(typeof(T));
                bodyData = MessagePackSerializer.Serialize(value, UnityContractResolver.Instance);
                break;
            }

            bodyData = Encrypt(bodyData);

            request.uploadHandler = new UploadHandlerRaw(bodyData);
        }
コード例 #2
0
        public static T Get <T>() where T : LocalData, new()
        {
            T result = null;

            MessagePackValidater.ValidateAttribute(typeof(T));

            var filePath = Instance.GetLocalDataFilePath <T>();

            if (File.Exists(filePath))
            {
                using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                {
                    var bytes = new byte[fileStream.Length];

                    fileStream.Read(bytes, 0, bytes.Length);

                    bytes = bytes.Decrypt(Instance.aesManaged);

                    var options = StandardResolverAllowPrivate.Options
                                  .WithCompression(MessagePackCompression.Lz4BlockArray)
                                  .WithResolver(UnityContractResolver.Instance);

                    result = MessagePackSerializer.Deserialize <T>(bytes, options);
                }
            }

            if (result == null)
            {
                result = new T();
            }

            return(result);
        }
コード例 #3
0
        private TResult Deserialize <TResult>(byte[] value) where TResult : class
        {
            if (value == null || value.IsEmpty())
            {
                return(null);
            }

            TResult result = null;

            value = Decrypt(value);

            switch (Format)
            {
            case DataFormat.Json:
            {
                if (Compress)
                {
                    value = value.Decompress();
                }

                var json = Encoding.UTF8.GetString(value);

                if (!string.IsNullOrEmpty(json))
                {
                    result = JsonConvert.DeserializeObject <TResult>(json);
                }
            }
            break;

            case DataFormat.MessagePack:
            {
                MessagePackValidater.ValidateAttribute(typeof(TResult));

                if (value != null && value.Any())
                {
                    var options = StandardResolverAllowPrivate.Options.WithResolver(UnityContractResolver.Instance);

                    if (Compress)
                    {
                        options = options.WithCompression(MessagePackCompression.Lz4Block);
                    }

                    result = MessagePackSerializer.Deserialize <TResult>(value, options);
                }
            }
            break;
            }

            return(result);
        }
コード例 #4
0
        private bool SaveCache(object[] masterData, string applicationVersion, string masterVersion, AesManaged aesManaged)
        {
            try
            {
                var master = masterData.Select(x => (T)Activator.CreateInstance(typeof(T), x)).ToArray();

                SetMaster(master);

                var installPath = GetLocalCacheFilePath();

                var directory = Path.GetDirectoryName(installPath);

                if (!Directory.Exists(directory))
                {
                    Directory.CreateDirectory(directory);
                }

                #if UNITY_EDITOR
                MessagePackValidater.ValidateAttribute(typeof(TCache));
                MessagePackValidater.ValidateAttribute(typeof(T));
                #endif

                var cacheData = new TCache()
                {
                    values = masters.Values.ToArray()
                };

                var data    = LZ4MessagePackSerializer.Serialize(cacheData, UnityContractResolver.Instance);
                var encrypt = data.Encrypt(aesManaged);

                File.WriteAllBytes(installPath, encrypt);

                versionPrefs.version = ConvertVersionStr(applicationVersion, masterVersion);
            }
            catch (Exception exception)
            {
                Debug.LogException(exception);
                OnError();

                return(false);
            }

            return(true);
        }
コード例 #5
0
        public static void Save <T>(T data) where T : LocalData, new()
        {
            MessagePackValidater.ValidateAttribute(typeof(T));

            var filePath = Instance.GetLocalDataFilePath <T>();

            using (var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
            {
                var options = StandardResolverAllowPrivate.Options
                              .WithCompression(MessagePackCompression.Lz4BlockArray)
                              .WithResolver(UnityContractResolver.Instance);

                var bytes = MessagePackSerializer.Serialize(data, options);

                bytes = bytes.Encrypt(Instance.aesManaged);

                fileStream.Write(bytes, 0, bytes.Length);
            }
        }
コード例 #6
0
        protected virtual UploadHandler CreateUploadHandler <TContent>(TContent content)
        {
            if (content == null)
            {
                return(null);
            }

            byte[] bodyData = null;

            switch (Format)
            {
            case DataFormat.Json:
            {
                var json = JsonConvert.SerializeObject(content);
                bodyData = Encoding.UTF8.GetBytes(json);

                if (Compress)
                {
                    bodyData = bodyData.Compress();
                }
            }
            break;

            case DataFormat.MessagePack:
            {
                MessagePackValidater.ValidateAttribute(typeof(TContent));

                var options = StandardResolverAllowPrivate.Options.WithResolver(UnityContractResolver.Instance);

                if (Compress)
                {
                    options = options.WithCompression(MessagePackCompression.Lz4Block);
                }

                bodyData = MessagePackSerializer.Serialize(content, options);
            }
            break;
            }

            bodyData = Encrypt(bodyData);

            return(new UploadHandlerRaw(bodyData));
        }
コード例 #7
0
ファイル: WebRequest.cs プロジェクト: Yuu03/UnityFramework
        private TResult Deserialize <TResult>(byte[] value) where TResult : class
        {
            if (value == null || value.IsEmpty())
            {
                return(null);
            }

            TResult result = null;

            value = Decrypt(value);

            switch (Format)
            {
            case DataFormat.Json:

                var json = Encoding.UTF8.GetString(value);

                if (!string.IsNullOrEmpty(json))
                {
                    result = JsonFx.Json.JsonReader.Deserialize <TResult>(json);
                }

                break;

            case DataFormat.MessagePack:

                MessagePackValidater.ValidateAttribute(typeof(TResult));

                if (value != null && value.Any())
                {
                    result = MessagePackSerializer.Deserialize <TResult>(value, UnityContractResolver.Instance);
                }

                break;
            }

            return(result);
        }
コード例 #8
0
        private IEnumerator LoadInternal(IObserver <bool> observer, AesManaged aesManaged)
        {
            var result = false;

            #if UNITY_EDITOR
            try
            {
                MessagePackValidater.ValidateAttribute(typeof(TMasterRecord));
            }
            catch (Exception exception)
            {
                Debug.LogException(exception);
            }
            #endif

            var installPath = MasterManager.Instance.GetInstallPath <TMaster>();

            Func <string, AesManaged, byte[]> loadCacheFile = (_installPath, _aesManaged) =>
            {
                // ファイル読み込み.
                var data = File.ReadAllBytes(_installPath);

                // 復号化.
                return(data.Decrypt(_aesManaged));
            };

            // ファイルの読み込みと復号化をスレッドプールで実行.
            var loadYield = Observable.Start(() => loadCacheFile(installPath, aesManaged)).ObserveOnMainThread().ToYieldInstruction();

            while (!loadYield.IsDone)
            {
                yield return(null);
            }

            if (!loadYield.HasError)
            {
                if (loadYield.HasResult)
                {
                    var bytes = loadYield.Result;

                    try
                    {
                        var options = StandardResolverAllowPrivate.Options
                                      .WithCompression(MessagePackCompression.Lz4BlockArray)
                                      .WithResolver(UnityContractResolver.Instance);

                        var container = MessagePackSerializer.Deserialize <TMasterContainer>(bytes, options);

                        SetRecords(container.records);

                        result = true;
                    }
                    catch (Exception exception)
                    {
                        Debug.LogException(exception);
                    }
                }
            }
            else
            {
                Debug.LogException(loadYield.Error);
            }

            if (!result)
            {
                File.Delete(installPath);
                OnError();
            }

            observer.OnNext(result);
            observer.OnCompleted();
        }
コード例 #9
0
        private IEnumerator LoadCacheInternal(IObserver <bool> observer, AesManaged aesManaged)
        {
            var sw = System.Diagnostics.Stopwatch.StartNew();

            #if UNITY_EDITOR
            try
            {
                MessagePackValidater.ValidateAttribute(typeof(TCache));
                MessagePackValidater.ValidateAttribute(typeof(T));
            }
            catch (Exception exception)
            {
                Debug.LogException(exception);
            }
            #endif

            var installPath = GetLocalCacheFilePath();

            Func <string, AesManaged, byte[]> loadCacheFile = (_installPath, _aesManaged) =>
            {
                // ファイル読み込み.
                var data = File.ReadAllBytes(_installPath);

                // 復号化.
                return(data.Decrypt(_aesManaged));
            };

            // ファイルの読み込みと復号化をスレッドプールで実行.
            var loadYield = Observable.Start(() => loadCacheFile(installPath, aesManaged)).ObserveOnMainThread().ToYieldInstruction();

            while (!loadYield.IsDone)
            {
                yield return(null);
            }

            var result = false;

            if (loadYield.HasResult)
            {
                var data = loadYield.Result;

                try
                {
                    var cachedData = LZ4MessagePackSerializer.Deserialize <TCache>(data, UnityContractResolver.Instance);

                    SetMaster(cachedData.values);

                    result = true;
                }
                catch (Exception exception)
                {
                    Debug.LogException(exception);
                }
            }

            sw.Stop();

            if (result)
            {
                MasterCacheLoadDiagnostic.Instance.Register <TInstance>(sw.Elapsed.TotalMilliseconds);
            }
            else
            {
                File.Delete(installPath);
                OnError();
            }

            observer.OnNext(result);
            observer.OnCompleted();
        }