--- 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#`