gpt4 book ai didi

c# - WCF:序列化和反序列化泛型集合

转载 作者:IT王子 更新时间:2023-10-29 04:38:45 26 4
gpt4 key购买 nike

我有一个拥有通用列表的类(class)团队:

[DataContract(Name = "TeamDTO", IsReference = true)]
public class Team
{
[DataMember]
private IList<Person> members = new List<Person>();

public Team()
{
Init();
}

private void Init()
{
members = new List<Person>();
}

[System.Runtime.Serialization.OnDeserializing]
protected void OnDeserializing(StreamingContext ctx)
{
Log("OnDeserializing of Team called");
Init();
if (members != null) Log(members.ToString());
}

[System.Runtime.Serialization.OnSerializing]
private void OnSerializing(StreamingContext ctx)
{
Log("OnSerializing of Team called");
if (members != null) Log(members.ToString());
}

[System.Runtime.Serialization.OnDeserialized]
protected void OnDeserialized(StreamingContext ctx)
{
Log("OnDeserialized of Team called");
if (members != null) Log(members.ToString());
}

[System.Runtime.Serialization.OnSerialized]
private void OnSerialized(StreamingContext ctx)
{
Log("OnSerialized of Team called");
Log(members.ToString());
}

当我在 WCF 服务中使用此类时,我得到以下日志输出

OnSerializing of Team called    
System.Collections.Generic.List 1[XXX.Person]

OnSerialized of Team called
System.Collections.Generic.List 1[XXX.Person]

OnDeserializing of Team called
System.Collections.Generic.List 1[XXX.Person]

OnDeserialized of Team called
XXX.Person[]

反序列化后 members 是一个数组,不再是一个通用列表,尽管字段类型是 IList<>(?!)当我尝试通过 WCF 服务将此对象发回时,我得到了日志输出

OnSerializing of Team called
XXX.Person[]

此后我的单元测试因 System.ExecutionEngineException 崩溃,这意味着 WCF 服务无法序列化数组。 (可能是因为它需要一个 IList<>)

所以,我的问题是:有人知道为什么我的 IList<> 的类型在反序列化后是一个数组,以及为什么在那之后我不能再序列化我的 Team 对象了吗?

谢谢

最佳答案

您遇到了 DataContractSerializer 之一陷阱。

修复:将您的私有(private)成员声明更改为:

[DataMember]
private List<Person> members = new List<Person>();

或将属性更改为:

[DataMember()]
public IList<Person> Feedback {
get { return m_Feedback; }
set {
if ((value != null)) {
m_Feedback = new List<Person>(value);

} else {
m_Feedback = new List<Person>();
}
}
}

它会起作用的。 Microsoft Connect 错误是 here

当您反序列化带有 IList<T> 的对象时会出现此问题DataMember,然后再次尝试序列化同一实例。

如果你想看一些很酷的东西:

using System;
using System.Collections.Generic;

class TestArrayAncestry
{
static void Main(string[] args)
{
int[] values = new[] { 1, 2, 3 };
Console.WriteLine("int[] is IList<int>: {0}", values is IList<int>);
}
}

它将打印int[] is IList<int>: True .

我怀疑这可能是您在反序列化后看到它作为数组返回的原因,但它非常不直观。

如果您在 IList<int> 上调用 Add() 方法但是,它会抛出 NotSupportedException .

其中一个 .NET 怪癖。

关于c# - WCF:序列化和反序列化泛型集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2562088/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com