오랜만이라 그런가.. 적응이 안된? 뭐.. 그런.. 잠시의 작업으로

 

내 기억이라면 또 까먹기에..

 

NetworkStream으로 주고 받을 때도 Receive 될 시 대기가 된 다는 것은.. 알고 있던건데..

 

문제는.. DeSerialize...

 

Exception이 죽어라 떠 주시길래..

 

구글신이 응답을 주셨...다..

 

샘플 코드를 보면..

 

[Server]

sealed class AllowAllAssemblyVersionsDeserializationBinder : System.Runtime.Serialization.SerializationBinder
    {
        public override Type BindToType(string assemblyName, string typeName)
        {
            Type typeToDeserialize = null;
            String currentAssembly = Assembly.GetExecutingAssembly().FullName;
            assemblyName = currentAssembly;
            typeToDeserialize = Type.GetType(string.Format("{0},{1}", typeName, assemblyName));
            return typeToDeserialize;

        }
    }

 

IPAddress address = IPAddress.Parse("192.168.1.143");
            TcpListener server = new TcpListener(address, 7771);
            server.Start();

            while(true)
            {
                Socket sock = server.AcceptSocket();
                if (sock.Connected)
                {
                    NetworkStream nStream = new NetworkStream(sock);

                    MemoryStream mStream = new MemoryStream();

                    byte[] size = new byte[4];

                    int receivedData;

                    receivedData = nStream.Read(size, 0, size.Length);
                    mStream.Write(size, 0, receivedData);

                    Console.WriteLine(BitConverter.ToInt32(size, 0));
                    mStream.Seek(0, SeekOrigin.Begin);

                    byte[] buffer = new byte[BitConverter.ToInt32(size, 0)];

                    receivedData = nStream.Read(buffer, 0, buffer.Length);
                    mStream.Write(buffer, 0, receivedData);

                    BinaryFormatter bf = new BinaryFormatter();
                    bf.Binder = new AllowAllAssemblyVersionsDeserializationBinder();
                    mStream.Seek(0, SeekOrigin.Begin);
                    testData a = bf.Deserialize(mStream) as testData;

                    Console.WriteLine(a.test);

                    mStream.Close();
                    nStream.Close();
                }
            }

 

[Client]

static void Main(string[] args)
        {
            ArrayList a = new ArrayList();
           
            testData data = new testData();
            data.test = "test";

            a.Add(data);

            MemoryStream m = serialize(data);
            m.Seek(0, SeekOrigin.Begin);

            byte[] size = new byte[4];

            byte[] buffer = m.ToArray();

            size = BitConverter.GetBytes(buffer.Length);

            TcpClient client = new TcpClient("192.168.1.143", 7771);
            NetworkStream nStream = client.GetStream();

            nStream.Write(size, 0, size.Length);
            nStream.Write(buffer, 0, buffer.Length);

            nStream.Close();
            client.Close();
        }

        private static MemoryStream serialize(testData arr)
        {
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream mStream = new MemoryStream();
           
            bf.Serialize(mStream, arr);

            return mStream;
        }

저~짝 Server에 보면 AllowAllAssemblyVersionsDeserializationBinder Class가 있다..

 

저 부분을 추가 해 주고 BinaryFormatter에 Bind 시켜주니..

 

이쁘게 잘된다..

 

그리고 다들 알다 시피 직렬화 할 때는 대상 Class 위에 [Serialize] 명시는 꼭 해주고..

 

또한.. 서로 다른 Library를 만들어 놓고 Class 내용만 같게 하는 일이 있다면.. 정말.. 혼나야겠고..

 

해 보면 죽어라 Exception이 일어나는 일을 만나게 될 것임돠.

 

테스트 해 봤더니 신날하게 나서 방법 없을라나 고민 해 봤지만 하다가 포기..

 

그냥 같은 library 쓰고 하면 되니까..

 

요새 손 안대던 부분까지 다시 하니까 기억이 가물 가물.. 나도 이제 끝인가ㅠ