버그 해결을 위한 모든 질문을 던져
+2 votes
172 views
...

BinaryFormatter formatter = new BinaryFormatter();
formatter.Binder = new AllowAllAssemblyVersionsDeserializationBinder();
formatter.Binder.BindToType(typeof(T).Assembly.FullName, typeName);

FileStream stream = new FileStream(ReplayPath + fileName, FileMode.Open);
T t = (T)formatter.Deserialize(stream);

stream.Dispose();
stream.Close();

...

위에 처럼 파일을 로드할떄 해당 파일의 용량이 크면 로드 할동안 멈춰버리더라고요.

로드하는 중간 중간에 제어를 풀어주는 옵션이나 방법이 없을까요??
asked (10 point) , 172 views

3 answers

+2 votes
코루틴 이런거에서 프레임에 무리 없을 정도로 조금씩 Read/Write -> yield 하셔야 원하는 모양이 될듯 합니다.

write 하실때는 데이터 변동 없도록 컨트롤에 주의하시면 될듯하네요.
answered (44 point)
T t = (T)formatter.Deserialize(stream);
이부분이 읽어들이는 부분인데, 이 읽어들이는 부분을 어떻게 바꾸어야 읽기를 나누어서 할수 있을까요??
+1 vote

Deserialize는 따로 돌리시고 Action으로 결과 받으시면 됩니다.

끝나길 기다려야 되면 코루틴으로 끝날 때까지 대기하는 로직 쓰시면 됩니다.

예제 대충 짜봤습니다.

 

using System;
using System.Collections;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine;
using UnityEngine.UI;
 
public class FileDeserializer : MonoBehaviour
{
    private IEnumerator Start()
    {
        Image imageToDisplay = null;
        Deserialize<Image>("Image", string.Empty, string.Empty, (t) =>
        {
            if (t != null)
            {
                imageToDisplay = t;
                Debug.LogFormat("Finished Deserialize : {0}", t.name);
            }
        });
 
        // Waiting for deserializing image.
        yield return new WaitUntil(() => imageToDisplay != null);
 
        // Do something when deserializing is done.
    }
 
    private void Update()
    {
        // Do anything without freezing.
    }
 
    private void Deserialize<T>(string typeName, string ReplayPath, string fileName, Action<T> onComplete = null)
    {
        BinaryFormatter formatter = new BinaryFormatter
        {
            Binder = new AllowAllAssemblyVersionsDeserializationBinder()
        };
        formatter.Binder.BindToType(typeof(T).Assembly.FullName, typeName);
 
        FileStream stream = new FileStream(ReplayPath + fileName, FileMode.Open);
        T t = (T)formatter.Deserialize(stream);
 
        stream.Dispose();
        stream.Close();
    }
 
    private class AllowAllAssemblyVersionsDeserializationBinder : SerializationBinder
    {
        public override Type BindToType(string assemblyName, string typeName)
        {
            // TODO
            return default;
        }
    }
}
answered (97 point)
+2 votes
비동기 API가 따로 없다면 태스크 새로 돌려서 시도해보세요

bool complete = false;
System.Threading.Tasks.Task.Run(() =>
{
    //    불러오기...
    complete = true;
});

while (!complete) yield return new WaitForEndOfFrame();

 

메인스레드에서 돌아가야한다면 묵념.. 파일을 쪼개셔야할듯
answered (70 point)
잘 되네요~~ 감사합니다 ^_____^

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

270 질문
403 answers
407 댓글
563 users