ฉันมีแอปพลิเคชันที่ต้องใช้ตัวซีเรียลไลเซอร์สัญญาข้อมูลสำหรับประเภทที่แตกต่างกันแต่คล้ายกัน:
- รายการทั่วไป
- คอลเลกชันทั่วไป
- อาร์เรย์
ตามคำขอจาก Scrobi นี่เป็นตัวอย่างแบบเต็ม:
[DataContract]
public class Model
{
public Model()
{
List = new List<int>(new[] {1, 2, 3});
Collection = new Collection<int>(new[] {4, 5, 6});
Array = new[] {7, 8, 9};
}
[DataMember]
public object List { get; set; }
[DataMember]
public object Collection { get; set; }
[DataMember]
public object Array { get; set; }
public string SerializeMe()
{
var serializer = new DataContractSerializer(typeof(Model), GetKnownTypes());
using (var stream = new MemoryStream())
{
serializer.WriteObject(stream, this); // exception
return Encoding.UTF8.GetString(stream.GetBuffer());
}
}
public static Type[] GetKnownTypes()
{
return new[]
{
typeof(List<int>),
typeof(Collection<int>), // error
typeof(int[]) // error
};
}
}
ปัญหาคือ: ฉันไม่สามารถเพิ่มรายการทั่วไป คอลเลกชัน และอาร์เรย์พร้อมกันได้ เนื่องจากทั้งหมดใช้สัญญาข้อมูลเดียวกัน
เมื่อฉันใช้คอลเลกชั่นประเภทใดประเภทหนึ่งเท่านั้น ฉันจะไม่สามารถซีเรียลไลซ์ประเภทอื่นได้ เนื่องจากไม่ทราบ (มีสัญญาข้อมูลอยู่ แต่มีประเภทอื่น) ใช่ ฟิลด์ต่างๆ จะต้องเป็นอ็อบเจ็กต์เพื่อให้ใช้งานได้ในกรณีของฉัน (และในแอปพลิเคชันจริง ฉันไม่สามารถเพิ่มแอตทริบิวต์ให้กับฟิลด์เหล่านั้นได้)
เป็นไปไม่ได้เลยในแอปพลิเคชันที่ฉันเขียนเพื่อใช้ประเภทใดประเภทหนึ่งเท่านั้น เนื่องจากเป็นสภาพแวดล้อมการพัฒนาประเภทหนึ่งและนักพัฒนาสามารถเลือกประเภทได้อย่างอิสระ
มีวิธีแก้ไขชั่วคราวสำหรับข้อจำกัดนี้ของตัวซีเรียลไลเซอร์สัญญาข้อมูลหรือไม่
ขอบคุณ,
Collection<int>
ให้กับประเภทที่รู้จัก หากคอลเลกชันทั้งหมดเทียบเท่าและแลกเปลี่ยนได้แล้ว? - person Scrobi   schedule 03.07.2017XmlSerializer
: XmlInclude : รายการและอาร์เรย์ อาจเป็นวิธีแก้ปัญหาที่คล้ายกันก็ใช้ได้ผลที่นี่เช่นกัน - person dbc   schedule 03.07.2017