2015. 1. 7. 21:00

닷넷에서 클래스(Class)와 같은 오브젝트(object)를 바이트 배열(byte Array)로 만드는 건 좀 번거로운 작업이 필요합니다.

 

그런 번거로운 작업 중 재미있는 게 있어서 퍼왔습니다.

바로 'XML'을 이용하여 클래스를 바이트 배열로 만드는 것입니다.

(참고 : code.about - HOW TO CONVERT FROM YOUR CLASS OBJECT TO BYTE[] AND VICE VERSA AND SEND IT THROUGH SOCKETS)

 

 

1. 기능 구현하기

일단 클래스를 만들어 봅시다.

 

public class TestXML
{
	public string Data1 { get; set; }
	public string Data2 { get; set; }
	public string Data3 { get; set; }
}

public class claClassToByte
{
	public byte[] ClassToByteArray(Object objClass)
	{
		try
		{
			MemoryStream ms = new MemoryStream();
			XmlSerializer xmlS = new XmlSerializer(typeof(TestXML));
			XmlTextWriter xmlTW = new XmlTextWriter(ms, Encoding.UTF8);

			xmlS.Serialize(xmlTW, objClass);
			ms = (MemoryStream)xmlTW.BaseStream;

			return ms.ToArray();
		}
		catch (Exception)
		{
			throw;
		}
	}

	public Object ByteArrayToClass(byte[] buffer)
	{
		try
		{
			XmlSerializer xmlS = new XmlSerializer(typeof(TestXML));
			MemoryStream ms = new MemoryStream(buffer);
			XmlTextWriter xmlTW = new XmlTextWriter(ms, Encoding.UTF8);

			return xmlS.Deserialize(ms);
		}
		catch (Exception)
		{
			throw;
		}
	}
}

 

 

코드는 심플합니다.

메모리 스크림(Memory Stream)을 이용하여 버퍼(buffer)를 만들거나 체운 뒤 인코딩이나 디코딩하여 사용합니다.

2. 테스트 코드

테스트는 위에서 만든 'TestXML'클래스를 바이트로 변환했다가 다시 'TestXML'로 변환하는 테스트 입니다.

2-1. 디자이너

디자인은 'TestXML'클래스에 넣을 데이터를 받도로 합니다.

 

 

 

 

 

2-2. 비하인드 코드

코드는 귀찬으니 한 함수에서 처리하도록 하였습니다.

데이터 확인은 중단점을 잡아서 합시다.

public partial class Form1 : Form
{
	private claClassToByte m_insCTB = new claClassToByte();

	public Form1()
	{
		InitializeComponent();
	}

	private void btnConvert_Click(object sender, EventArgs e)
	{
		TestXML insXML = new TestXML();
		insXML.Data1 = txtData1.Text;
		insXML.Data2 = txtData2.Text;
		insXML.Data3 = txtData3.Text;

		byte[] byteTemp = this.m_insCTB.ClassToByteArray(insXML);

		TestXML insXML2 = (TestXML)this.m_insCTB.ByteArrayToClass(byteTemp);

		txtOutput.Text = string.Format("Data1 : {0}, Data1 : {1}, Data1 : {2}"
										, insXML2.Data1, insXML2.Data2, insXML2.Data3);
	}
}

 

 

3. 테스트 하기

이제 위에 코드를 돌리면 잘돌아갑니다.

 

바이트로 변환된 데이터를 확인해 봅시다.

바이트가 'UTF8'로 인코딩 되어 있으니 'Encoding.UTF8.GetString(ms.ToArray())'이런 식으로 번역하면 문자열(string)로 볼 수 있습니다.

 

 

직접 실행창을 보면 XML로 변환된 클래스의 내용을 볼 수 있습니다.

 

내용은 아래와 같습니다.

<?xml version="1.0" encoding="utf-8"?>
<TestXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
	<Data1>11aa</Data1>
	<Data2>22bb</Data2>
	<Data3>33cc</Data3>
</TestXML>

 

이런이런....

내용이 XML형식으로 변환이 되어 있습니다.

XML의 단점도 그대로 가지고 간다는 의미입니다.

(무겁고 쓸때없는 데이터가 너무 많이 들어 있다.)

 

이걸 소켓통신에 쓰기에는 너무 크다는 의미 입니다 ㅎㅎㅎㅎ

아무대나 막쓰긴 힘들듯 하네요 ㅡ.-;;;

 

ClassToByte_XML.zip