hat*_*h22 2 c# serialization tuples datacontractserializer c#-4.0
在 C# 4.0 中,我尝试Tuple<Guid, int[]>使用 DataContractSerializer 序列化和反序列化 a。我已经成功序列化和反序列化 type Guid、 typeint[]和 type Tuple<Guid, int>。如果我尝试序列化 type Tuple<Guid, int[]>,所有内容都会编译,但会出现以下运行时异常:
Type 'System.Int32[]' with data contract name
'ArrayOfint:http://schemas.microsoft.com/2003/10/Serialization/Arrays'
is not expected. Consider using a DataContractResolver or add any types
not known statically to the list of known types - for example, by using
the KnownTypeAttribute attribute or by adding them to the list of known
types passed to DataContractSerializer.
Run Code Online (Sandbox Code Playgroud)
我的序列化和反序列化例程很简单:
public static string Serialize<T>(this T obj)
{
var serializer = new DataContractSerializer(obj.GetType());
using (var writer = new StringWriter())
using (var stm = new XmlTextWriter(writer))
{
serializer.WriteObject(stm, obj);
return writer.ToString();
}
}
public static T Deserialize<T>(this string serialized)
{
var serializer = new DataContractSerializer(typeof(T));
using (var reader = new StringReader(serialized))
using (var stm = new XmlTextReader(reader))
{
return (T)serializer.ReadObject(stm);
}
}
Run Code Online (Sandbox Code Playgroud)
为什么我会遇到此异常?我可以采取什么措施来解决或绕过它?在我看来,Tuple可以序列化的包含类型在序列化时应该没有问题。
像这样的事情怎么样?
class Program
{
public static class DataContractSerializerFactory<T>
{
private static IEnumerable<Type> GetTypeArguments(Type t, IEnumerable<Type> values)
{
if (t.IsGenericType)
foreach (var arg in t.GetGenericArguments())
values = values.Union(GetTypeArguments(arg, values));
else
values = values.Union(new[] { t });
return values;
}
public static DataContractSerializer Create()
{
return new DataContractSerializer(typeof(T), GetTypeArguments(typeof(T), new[] { typeof(T) }));
}
}
static void Main(string[] args)
{
var x = Tuple.Create(Guid.NewGuid(), new[] { 1, 2, 3, 4, 5, 6 });
var serializer = DataContractSerializerFactory<Tuple<Guid, int[]>>.Create();
var sb = new StringBuilder();
using (var writer = XmlWriter.Create(sb))
{
serializer.WriteObject(writer, x);
writer.Flush();
Console.WriteLine(sb.ToString());
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:应该适用于任何嵌套泛型。仅考虑基本类型和叶类型参数。如果您希望中间容器也成为 KnownTypes 的一部分,应该很容易。
| 归档时间: |
|
| 查看次数: |
2183 次 |
| 最近记录: |