2016-07-08 6 views
0

(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, и я не могу для жизни понять, почему.

ответ

0

Независимо от того, является ли объект Scope сериализованным, управляется имуществом ScopeSpecified и методом ShouldSerializeScope(); в вашем классе оба присутствуют, и вы не устанавливаете ScopeSpecified в true, поэтому Scope не сериализуется (видимо, ScopeSpecified имеет преимущество перед ShouldSerializeScope()). Поскольку вы реализовали некоторую логику в методах ShouldSerialize*, вам, вероятно, не нужны свойства *Specified. Просто удалите их, и он будет работать, как ожидалось.

+0

Миллион спасибо за это! Мне показалось, что вам нужно как «ShouldSerialize *», так и «* Specified», чтобы держать вещи аккуратными и аккуратными. – Kulstad

+0

@ Kulstad, нет, вам нужен только один из них. По моему мнению, выбор между двумя был неудачным дизайнерским решением ... –