검색결과 리스트
C# MemoryStream에 해당되는 글 1건
- 2015.09.16 [C#] NetworkStream과 Serialize, DeSerialize
글
오랜만이라 그런가.. 적응이 안된? 뭐.. 그런.. 잠시의 작업으로
내 기억이라면 또 까먹기에..
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 쓰고 하면 되니까..
요새 손 안대던 부분까지 다시 하니까 기억이 가물 가물.. 나도 이제 끝인가ㅠ
RECENT COMMENT