---
lang: ja-jp
breaks: true
---
# C# `DataContractSerializer` シリアライズ/デシリアライズ 2021-09-21
> .NET(C#)におけるシリアライザのパフォーマンス比較
> http://neue.cc/2010/05/29_261.html
## DataContractSerializer テキスト
### シリアライズ
```csharp=
public static byte[] SerializeToByteArray_DataContract<T>(
T data,
DataContractResolver resover = null,
ISerializationSurrogateProvider provider = null
) where T : class
{
byte[] ret = null;
try
{
using (var stream = new System.IO.MemoryStream())
{
var setting = new DataContractSerializerSettings();
if (resover != null)
{
setting.DataContractResolver = resover;
}
var serializer = new DataContractSerializer(typeof(T), setting);
if (provider != null)
{
serializer.SetSerializationSurrogateProvider(provider);
}
serializer.WriteObject(stream, data);
ret = stream.ToArray();
stream.Close();
}
}
catch (Exception)
{ throw; }
return ret;
}
```
```csharp=
public static string SerializeToXML_DataContract<T>(
T data,
DataContractResolver resover = null,
ISerializationSurrogateProvider provider = null
) where T : class
{
string ret = null;
try
{
using (var stream = new System.IO.MemoryStream())
{
var setting = new DataContractSerializerSettings();
if (resover != null)
{
setting.DataContractResolver = resover;
}
var serializer = new DataContractSerializer(typeof(T), setting);
if (provider != null)
{
serializer.SetSerializationSurrogateProvider(provider);
}
serializer.WriteObject(stream, data);
ret = System.Text.Encoding.UTF8.GetString(stream.ToArray());
stream.Close();
}
}
catch (Exception)
{ throw; }
return ret;
}
```
### デシリアライズ
```csharp=
public static T DeserializeFromByteArray_DataContract<T>(
byte[] data,
DataContractResolver resover = null,
ISerializationSurrogateProvider provider = null
) where T : class
{
T ret = default(T);
try
{
byte[] buffer = data;
using (var stream = new System.IO.MemoryStream(buffer))
{
var setting = new DataContractSerializerSettings();
if (resover != null)
{
setting.DataContractResolver = resover;
}
var serializer = new DataContractSerializer(typeof(T), setting);
if (provider != null)
{
serializer.SetSerializationSurrogateProvider(provider);
}
ret = serializer.ReadObject(stream) as T;
stream.Close();
}
}
catch (Exception)
{ throw; }
return ret;
}
```
## DataContractSerializer バイナリ
### シリアライズ
```csharp=
public static byte[] SerializeToByteArray_DataContractBinary<T>(
T data,
DataContractResolver resover = null,
ISerializationSurrogateProvider provider = null
) where T: class
{
byte[] ret = null;
try
{
using (var stream = new System.IO.MemoryStream())
{
using (var binaryDictionaryWriter = XmlDictionaryWriter.CreateBinaryWriter(stream))
{
var setting = new DataContractSerializerSettings();
if (resover != null)
{
setting.DataContractResolver = resover;
}
var serializer = new DataContractSerializer(typeof(T), setting);
if (provider != null)
{
serializer.SetSerializationSurrogateProvider(provider);
}
serializer.WriteObject(binaryDictionaryWriter, data);
binaryDictionaryWriter.Flush();
}
ret = stream.ToArray();
stream.Close();
}
}
catch (Exception)
{ throw; }
return ret;
}
```
### デシリアライズ
```csharp=
public static T DeserializeFromByteArray_DataContractBinary<T>(
byte[] data,
DataContractResolver resover = null,
ISerializationSurrogateProvider provider = null
) where T : class
{
T ret = default(T);
try
{
byte[] buffer = data;
using (var stream = new System.IO.MemoryStream(buffer))
{
using (var reader = XmlDictionaryReader.CreateBinaryReader(stream, XmlDictionaryReaderQuotas.Max))
{
var setting = new DataContractSerializerSettings();
if (resover != null)
{
setting.DataContractResolver = resover;
}
var serializer = new DataContractSerializer(typeof(T), setting);
if (provider != null)
{
serializer.SetSerializationSurrogateProvider(provider);
}
ret = serializer.ReadObject(reader) as T;
}
stream.Close();
}
}
catch (Exception)
{ throw; }
return ret;
}
```
## DataContractJsonSerializer テキスト
### シリアライズ
```csharp=
public static byte[] SerializeToByteArray_DataContractJson<T>(
T data,
DataContractResolver resover = null
) where T : class
{
byte[] ret = null;
try
{
using (var stream = new System.IO.MemoryStream())
{
var serializer = new DataContractJsonSerializer(typeof(T));
serializer.WriteObject(stream, data);
ret = stream.ToArray();
stream.Close();
}
}
catch (Exception)
{ throw; }
return ret;
}
```
```csharp=
public static string SerializeToJson_DataContractJson<T>(
T data,
DataContractResolver resover = null
) where T : class
{
string ret = null;
try
{
using (var stream = new System.IO.MemoryStream())
{
var serializer = new DataContractJsonSerializer(typeof(T));
serializer.WriteObject(stream, data);
ret = System.Text.Encoding.UTF8.GetString(stream.ToArray());
stream.Close();
}
}
catch (Exception)
{ throw; }
return ret;
}
```
### デシリアライズ
```csharp=
public static T DeserializeFromByteArray_DataContractJson<T>(
byte[] data,
DataContractResolver resover = null
) where T : class
{
T ret = default(T);
try
{
byte[] buffer = data;
using (var stream = new System.IO.MemoryStream(buffer))
{
var serializer = new DataContractJsonSerializer(typeof(T));
ret = serializer.ReadObject(stream) as T;
stream.Close();
}
}
catch (Exception)
{ throw; }
return ret;
}
```
## DataContractJsonSerializer バイナリ
### シリアライズ
```csharp=
public static byte[] SerializeToByteArray_DataContractJsonBinary<T>(
T data,
DataContractResolver resover = null
) where T : class
{
byte[] ret = null;
try
{
using (var stream = new System.IO.MemoryStream())
{
using (var binaryDictionaryWriter = XmlDictionaryWriter.CreateBinaryWriter(stream))
{
var serializer = new DataContractJsonSerializer(typeof(T));
serializer.WriteObject(binaryDictionaryWriter, data);
binaryDictionaryWriter.Flush();
}
ret = stream.ToArray();
stream.Close();
}
}
catch (Exception)
{ throw; }
return ret;
}
```
### デシリアライズ
```csharp=
public static T DeserializeFromByteArray_DataContractJsonBinary<T>(
byte[] data,
DataContractResolver resover = null
) where T : class
{
T ret = default(T);
try
{
byte[] buffer = data;
using (var stream = new System.IO.MemoryStream(buffer))
{
using (var reader = XmlDictionaryReader.CreateBinaryReader(stream, XmlDictionaryReaderQuotas.Max))
{
var serializer = new DataContractJsonSerializer(typeof(T));
ret = serializer.ReadObject(reader) as T;
}
stream.Close();
}
}
catch (Exception)
{ throw; }
return ret;
}
```
## `ISerializationSurrogateProvider`
### 列挙型を数値としてシリアライズするプロバイダ
```csharp=
using System;
using System.Runtime.Serialization;
namespace Grpc_Interface.grpc.provider
{
public class SerializationSurrogateProvider : ISerializationSurrogateProvider
{
public SerializationSurrogateProvider()
: base()
{ }
public object GetDeserializedObject(object obj, Type targetType)
{
if (obj == null) { return obj; } // 値がnullの場合は何もしない
else if (targetType.IsEnum)
{
// ターゲットがenum型の場合はenum型に変換した値を返す。
return Convert.ChangeType(obj, targetType);
}
return obj; // enum型以外の場合は何もしない
}
public object GetObjectToSerialize(object obj, Type targetType)
{
if (obj == null) { return obj; } // 値がnullの場合は何もしない
Type type = obj.GetType();
if (type.IsEnum)
{
// enum型の場合は元となるデータ型に変換した値を返す。
return Convert.ChangeType(obj, type.GetEnumUnderlyingType());
}
return obj; // enum型以外の場合は何もしない
}
public Type GetSurrogateType(Type type)
{
if (type.IsEnum)
{
// enum型の場合は元となるデータ型を返す。
return type.GetEnumUnderlyingType();
}
return type; // enum型以外の場合は何もしない
}
}
}
```
:::info
.NET Frameworkでは、`IDataContractSurrogate`
:::
###### tags: `DataContractSerializer` `シリアライズ` `デシリアライズ` `C#`