gpt4 book ai didi

c# - List<> 包含对象的 DataContract 序列化

转载 作者:太空狗 更新时间:2023-10-30 00:45:24 25 4
gpt4 key购买 nike

在开发一个测试用例来理解序列化时,我遇到了一个看起来很简单但无法弄清楚的问题。我希望能够将多个对象添加到列表<>,然后序列化该列表(在本例中我使用的是 DataContractJsonSerializer)。创建对象(node1 和 node2)后,我想将它们添加到 List<> (cn) 并对其进行序列化。但是,在添加 node1 和 node2 时出现无效参数错误(“无法从‘JSON_test.Aspirate’转换为‘JSON_test.CompositeNode’)。我相信这是让数组知道基本类型的问题,但我不知道不知道该怎么做,或者这是否确实是问题所在(对这一切仍然很陌生)。

谢谢。

namespace JSON_test
{
class Program
{
static void Main(string[] args)
{
Aspirate node1 = new Aspirate(25,40);
Dispense node2 = new Dispense(32,50);
ObjectToSerialize cn = new ObjectToSerialize();
cn.CompositeNode.Add (node1);
cn.CompositeNode.Add (node2);

MemoryStream stream1 = new MemoryStream();
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(ObjectToSerialize));
ser.WriteObject(stream1, cn.CompositeNode);
stream1.Position = 0;
StreamReader sr = new StreamReader(stream1);
Console.WriteLine(sr.ReadToEnd());
Console.ReadLine();
}
}

[DataContract]
public class ObjectToSerialize
{
private List<CompositeNode> compNode;
[DataMember]
public List<CompositeNode> CompositeNode
{
get {return this.CompositeNode;}
set { this.compNode = value; }
}

public ObjectToSerialize()
{
}
}

[DataContract]
public class CompositeNode
{

}

[DataContract]
public class Aspirate
{
[DataMember]
public string NodeName = "Aspirate";
[DataMember]
public double ZTravelHt;
[DataMember]
public double IndexHt;

public Aspirate(double ZTravelHt, double IndexHt)
{
this.ZTravelHt = ZTravelHt;
this.IndexHt = IndexHt;
}
}

[DataContract]
public class Dispense
{
[DataMember]
public string NodeName = "Dispense";
[DataMember]
public double ZTravelHt;
[DataMember]
public double IndexHt;

public Dispense(double ZTravelHt, double IndexHt)
{
this.ZTravelHt = ZTravelHt;
this.IndexHt = IndexHt;
}
}
}

更新

namespace JSON_test
{
class Program
{
static void Main(string[] args)
{
Aspirate node1 = new Aspirate(25,40);
Dispense node2 = new Dispense(32,50);
ObjectToSerialize cn = new ObjectToSerialize();
cn.CompositeNode.Add (node1);
cn.CompositeNode.Add (node2);

MemoryStream stream1 = new MemoryStream();
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(ObjectToSerialize),
new Type[] {typeof (Aspirate), typeof (Dispense)});
ser.WriteObject(stream1, cn.CompositeNode);
stream1.Position = 0;
StreamReader sr = new StreamReader(stream1);
Console.WriteLine(sr.ReadToEnd());
Console.ReadLine();
}
}

[DataContract]
[KnownType(typeof(Aspirate))]
[KnownType(typeof(Dispense))]
public class ObjectToSerialize
{
private List<CompositeNode> compNode = new List<CompositeNode>();

[DataMember]
public List<CompositeNode> CompositeNode
{
get {return this.compNode;}
set { this.compNode = value; }
}

public ObjectToSerialize()
{

}
}

[DataContract]
[KnownType(typeof(Aspirate))]
[KnownType(typeof(Dispense))]
public class CompositeNode
{

}

[DataContract]
public class Aspirate : CompositeNode
{
[DataMember]
public string NodeName = "Aspirate";
[DataMember]
public double ZTravelHt;
[DataMember]
public double IndexHt;

public Aspirate(double ZTravelHt, double IndexHt)
{
this.ZTravelHt = ZTravelHt;
this.IndexHt = IndexHt;
}
}

[DataContract]
public class Dispense : CompositeNode
{
[DataMember]
public string NodeName = "Dispense";
[DataMember]
public double ZTravelHt;
[DataMember]
public double IndexHt;

public Dispense(double ZTravelHt, double IndexHt)
{
this.ZTravelHt = ZTravelHt;
this.IndexHt = IndexHt;
}
}
}

最佳答案

您可以将 KnownTypeAttribute 添加到 ObjectToSerialize 以让序列化器知道期望的类型:

[DataContract]
[KnownType(typeof(Aspirate))]
[KnownType(typeof(Dispense))]
public class ObjectToSerialize
{
....
}

我知道类 AspirateDispense 派生自 CompositeNode?这在您的代码示例中并不清楚。

顺便说一句,你的代码有错误:

get {return this.CompositeNode;}    

应该是:

get {return this.compNode;}    

更新:回应您在评论中提出的问题:您必须在 ObjectToSerialize 的构造函数中初始化集合:

public ObjectToSerialize()
{
this.compNode = new List<CompositeNode>();
}

更新 2: 错误的行是:

ser.WriteObject(stream1, cn.CompositeNode);

这应该是:

ser.WriteObject(stream1, cn);

顺便说一句,你可以这样写:

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(ObjectToSerialize)); 

您已经使用属性定义了已知类型。将已知类型添加到构造函数是多余的。

关于c# - List<> 包含对象的 DataContract 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5532448/

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