... | ... | @@ -524,11 +524,66 @@ class XmlSerializerEx |
|
|
|
|
|
byte[] buf = ms.ToArray();
|
|
|
|
|
|
Console.WriteLine(Encoding.UTF8.GetString(buf)); //Xml형식으로 된 문자열을 출력한다. 기본적으로 UTF-8 인코딩으로 객체를 문자열로 직렬화한다.
|
|
|
Console.WriteLine(Encoding.UTF8.GetString(buf)); //Xml형식으로 된 문자열을 출력한다. 기본적으로 객체를 직렬화 할 때 UTF-8 인코딩 문자열로 직렬화한다.
|
|
|
//XmlSerializer는 다른 플랫폼 사이에서 상호 운용성이 높다. 문제는 실제 전송되는 데이터에 비해 형식상 붙는 데이터가 많아서 크기가 커진다.
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
### DataContractJsonSerializer
|
|
|
DataContractJsonSerializer는 클래스의 내용을 Json으로 직렬화한다. |
|
|
\ No newline at end of file |
|
|
DataContractJsonSerializer는 클래스의 내용을 Json으로 직렬화한다. XmlSerializer보다 더 적은 크기로 변환이 가능하다. 또 닷넷 이외의 여러 플랫폼 사이에서도 변환이 가능하다.
|
|
|
|
|
|
```c#
|
|
|
[DataContract] //직렬화하려는 클래스에 표시. public으로 선언되어 있으면 꼭 표시해주지 않아도 된다.
|
|
|
class Person //직렬화 대상 클래스의 접근 제한에 영향을 받는다. 다른 클래스의 inner 클래스가되서 private되면 예외가 발생한다.
|
|
|
{ //inner 클래스가 됐어도 [DataContract],[DataMember] 특성을 정의해주면 직렬화가 가능하다. 그 외 접근이 가능한 상황에서는 명시적으로 선언하지 않아도 작동한다.
|
|
|
[DataMember]
|
|
|
public int age;
|
|
|
[DataMember] //[DateContract]를 선언했을 때, [DataMember]를 선언하지 않으면 직렬화되지 않는다.
|
|
|
public string name;
|
|
|
[DataMember]
|
|
|
private int gender; //private은 직렬화되지 않는다.
|
|
|
|
|
|
public Person()
|
|
|
{
|
|
|
}
|
|
|
|
|
|
public Person(int age, string name, int gender)
|
|
|
{
|
|
|
this.age = age;
|
|
|
this.name = name;
|
|
|
this.gender = gender;
|
|
|
}
|
|
|
|
|
|
public override string ToString()
|
|
|
{
|
|
|
return string.Format("{0} {1}", this.age, this.name);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public class JsonSerializerEx
|
|
|
{
|
|
|
public static void Main()
|
|
|
{
|
|
|
DataContractJsonSerializer dcjs = new DataContractJsonSerializer(typeof(Person)); //참조관리자를 통해서 System.Runtime.Serialization 추가해야 사용가능.
|
|
|
|
|
|
MemoryStream ms = new MemoryStream();
|
|
|
|
|
|
Person person = new Person(25, "Doh", 1);
|
|
|
|
|
|
dcjs.WriteObject(ms, person);
|
|
|
|
|
|
ms.Position = 0;
|
|
|
|
|
|
Person clone = dcjs.ReadObject(ms) as Person;
|
|
|
|
|
|
Console.WriteLine(clone);
|
|
|
|
|
|
byte[] arr = ms.ToArray();
|
|
|
|
|
|
Console.WriteLine(Encoding.UTF8.GetString(arr)); //{"age":25,"gender":1,"name":"Doh"}를 출력한다. 기본적으로 UTF-8로 인코딩하기 때문에
|
|
|
//읽기 위해서 UTF-8로 인코딩한다.
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|