(I originally posted this in CodeExchange, но сказали, что это неправильное место, чтобы поместить это)XMLSerializer не перенося байтами и ИНТА типов данных
У меня есть код сериализации моих отчетов:
[XmlRoot(Namespace = "", IsNullable = false)]
public partial class ReportSpecification{
/// <remarks/>
[XmlElementAttribute("Reports")]
public ReportsHolder Reports { get; set; }
/// <remarks/>
[XmlAttributeAttribute()]
public decimal Version { get; set; }
/// <remarks/>
[XmlAttributeAttribute()]
public string Username { get; set; }
}
public partial class ReportsHolder{
[XmlElement(IsNullable = true)]
public List<AlertSummary> AlertSummaryReportList { get; set; }
public ReportsHolder(){
this.AlertSummaryReportList = new List<AlertSummary>();
}
}
... и классы созданы для моих реальных отчетов
public abstract partial class BaseReport{
[XmlAttributeAttribute()]
public string ReportName { get; set; }
[XmlAttributeAttribute()]
public string FilterMode { get; set; }
[XmlAttributeAttribute()]
public string Destination { get; set; }
[XmlAttributeAttribute()]
public string Format { get; set; }
}
[XmlTypeAttribute(AnonymousType = true)]
public partial class AlertSummary : BaseReport{
public AlertSummaryFilters Filters;
private string _basicClass = "Device";
[XmlAttributeAttribute()]
public string BasicClass{
get { return _basicClass; }
set{ if (value.Length < 0) _basicClass = value; }
}
public AlertSummary(){
Filters = new AlertSummaryFilters();
}
[XmlTypeAttribute(AnonymousType = true)]
public class AlertSummaryFilters{
public string AlertSource { get; set; }
public byte? CriticalDevicesOnly { get; set; }
public byte? Scope { get; set; }
public ushort? DeviceID { get; set; }
public string DeviceType { get; set; }
public uint? DeviceGroup { get; set; }
public uint? DeviceFacility { get; set; }
public uint? DeviceRegion { get; set; }
[XmlIgnoreAttribute()]
public bool CriticalDevicesOnlySpecified { get; set; }
[XmlIgnoreAttribute()]
public bool ScopeSpecified { get; set; }
[XmlIgnoreAttribute()]
public bool DeviceSpecified { get; set; }
[XmlIgnoreAttribute()]
public bool DeviceGroupSpecified { get; set; }
[XmlIgnoreAttribute()]
public bool DeviceFacilitySpecified { get; set; }
[XmlIgnoreAttribute()]
public bool DeviceRegionSpecified { get; set; }
public bool ShouldSerializeCriticalDevicesOnly() { return CriticalDevicesOnly != null; }
public bool ShouldSerializeScope() { return Scope != null); }
public bool ShouldSerializeDeviceID(){ return DeviceID != null; }
public bool ShouldSerializeDeviceGroup(){ return DeviceGroup != null; }
public bool ShouldSerializeDeviceFacility(){ return DeviceFacility != null; }
public bool ShouldSerializeDeviceRegion(){ return DeviceRegion != null; }
internal AlertSummaryFilters() { }
}
..И Я правильно создать свой объект:
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
XmlSerializer serializer = new XmlSerializer(typeof(Alpha.ReportSpecification));
TextWriter writer = new StreamWriter(@"C:\temp\AlphaTest.xml");
// create the root object
Alpha.ReportSpecification myReportSpecification = new Alpha.ReportSpecification { Username = "Alpha Test", Version = (decimal)6.0 };
//create the report holder object
ReportsHolder myReportsHolder = new ReportsHolder();
// create a test AlertSummary report
AlertSummary myAlertSummary = new AlertSummary();
myAlertSummary.ReportName = "Testing AlertSummary Report from Apha";
myAlertSummary.FilterMode = "Container";
myAlertSummary.Destination = "[email protected]";
myAlertSummary.Format = "PDF";
myAlertSummary.Filters.AlertSource = "Dracula";
myAlertSummary.Filters.Scope = 22;
myAlertSummary.Filters.DeviceGroup = 12;
// add the new AlertSummary to the AlertSummary report holder
myReportsHolder.AlertSummaryReportList.Add(myAlertSummary);
// set the ReportSpecification report holder equal to the ReportsHolder
myReportSpecification.Reports = myReportsHolder;
// dump everything to the output file
serializer.Serialize(writer, myReportSpecification, ns);
writer.Close()
... но я не получаю байт? Типы данных в результирующей на всех:
<?xml version="1.0" encoding="utf-8"?>
<ReportSpecification Version="6" Username="Alpha Test">
<Reports>
<AlertSummaryReportList ReportName="Testing AlertSummary Report from Apha" FilterMode="Container" Destination="[email protected]" Format="PDF" BasicClass="Device">
<Filters>
<AlertSource>Dracula</AlertSource>
<!-- Scope sould be here -->
<!-- DeviceGroup should be here -->
</Filters>
</AlertSummaryReportList>
</Reports>
</ReportSpecification>
Пожалуйста, помогите мне узнать, что я делаю неправильно, и почему Scope и элементы DeviceGroup не будут отображаться в моем XML? Кажется, это влияет на байты и ints, и я не могу для жизни понять, почему.
Миллион спасибо за это! Мне показалось, что вам нужно как «ShouldSerialize *», так и «* Specified», чтобы держать вещи аккуратными и аккуратными. – Kulstad
@ Kulstad, нет, вам нужен только один из них. По моему мнению, выбор между двумя был неудачным дизайнерским решением ... –