Showing posts with label deserializing. Show all posts
Showing posts with label deserializing. Show all posts

Tuesday, February 14, 2012

deserializing ScheduleDefinition from GetSubscriptionProperties me

I got deserializing to work, but the problem is; If I create the schedule
using the web interface it will not work, but if I do it using my interface
it works.
The XML that is returned from my subscription reports:
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScheduleDefinition
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n <StartDateTime
xmlns=\"http://schemas.microsoft.com/sqlserver/2003/12/reporting/reportingservices\">2005-03-25T13:24:26.4506144-05:00</StartDateTime>\n
<EndDate
xmlns=\"http://schemas.microsoft.com/sqlserver/2003/12/reporting/reportingservices\">2005-03-25T13:24:26.4506144-05:00</EndDate>\n
<MinuteRecurrence
xmlns=\"http://schemas.microsoft.com/sqlserver/2003/12/reporting/reportingservices\">\n
<MinutesInterval>900</MinutesInterval>\n
</MinuteRecurrence>\n</ScheduleDefinition>"
The XML that is returned from a report scheduled using the web app:
"<ScheduleDefinition><StartDateTime>2005-03-25T05:30:00.000-05:00</StartDateTime><MinuteRecurrence><MinutesInterval>105</MinutesInterval></MinuteRecurrence></ScheduleDefinition>"
private wsReportingServices.ScheduleDefinition
DeSerializeSchedule(string XMLString)
{
MemoryStream vStream = GetStreamFromString(XMLString);
XmlAttributes attrs=new XmlAttributes();
attrs.XmlElements.Add(new
XmlElementAttribute("MinuteRecurrence",typeof(wsReportingServices.MinuteRecurrence)));
attrs.XmlElements.Add(new
XmlElementAttribute("DailyRecurrence",typeof(wsReportingServices.DailyRecurrence)));
attrs.XmlElements.Add(new
XmlElementAttribute("WeeklyRecurrence",typeof(wsReportingServices.WeeklyRecurrence)));
attrs.XmlElements.Add(new
XmlElementAttribute("MonthlyRecurrence",typeof(wsReportingServices.MonthlyRecurrence)));
attrs.XmlElements.Add(new
XmlElementAttribute("MonthlyDOWRecurrence",typeof(wsReportingServices.MonthlyDOWRecurrence)));
XmlAttributeOverrides attrOver=new XmlAttributeOverrides();
attrOver.Add(typeof(wsReportingServices.ScheduleDefinition),"ScheduleDefinition",attrs);
XmlSerializer newSr=new
XmlSerializer(typeof(wsReportingServices.ScheduleDefinition),attrOver);
return
(wsReportingServices.ScheduleDefinition)newSr.Deserialize(vStream);
}Here is the code that works:
static public ScheduleDefinition GetScheduleDefinition(string
matchData)
{
ScheduleDefinition res = null;
if (!crgUtl.IsEmpty(matchData))
{
string endDateStart = "<EndDate>";
string endDateEnd = "</EndDate>";
string scheduleString = matchData;
string endDateString = string.Empty;
// 1. Find <EndDate> tag and parse it separately,
because it is not serialized correctly by Microsoft.
int posStart = matchData.IndexOf(endDateStart);
int posEnd = matchData.IndexOf(endDateEnd);
if (posStart != -1 && posEnd != -1)
{
endDateString = scheduleString.Substring(
posStart + endDateStart.Length,
posEnd - posStart - endDateStart.Length);
scheduleString =
scheduleString.Substring(0, posStart)
+ scheduleString.Substring(
posEnd + endDateEnd.Length,
scheduleString.Length - posEnd -
endDateEnd.Length);
}
// 2. Replace True/False on true/false.
scheduleString = scheduleString.Replace(">True</",
">true</");
scheduleString = scheduleString.Replace(">False</",
">false</");
// 2.1 Replace occurrences of which week item on
serialized correct value:
for (int i = 0; i < WHICH_WEEK_ENUM.Length; i++)
scheduleString =scheduleString.Replace(WHICH_WEEK_STRINGS[i], WHICH_WEEK_ENUM[i]);
// 3. Deserialize ScheduleDefinition.
Stream stream = null;
XmlReader xmlReader = null;
try
{
// set overrides options to pass namespace tag
during deserialization:
XmlAttributeOverrides overrides =GetScheduleOverrides();
stream = new
MemoryStream(System.Text.Encoding.Default.GetBytes(scheduleString));
xmlReader = new XmlTextReader(stream);
XmlSerializer ser = new
XmlSerializer(typeof(ScheduleDefinition), overrides);
res =(ScheduleDefinition)ser.Deserialize(xmlReader);
}
finally
{
if (xmlReader != null) xmlReader.Close();
if (stream != null) stream.Close();
}
if (res == null)
res = new ScheduleDefinition();
// 4. Parse EndDate.
DateTime endDate = DateTime.Today;
if (!crgUtl.IsEmpty(endDateString))
{
IFormatProvider culture = new
CultureInfo("en-US", true);
endDate = DateTime.Parse(endDateString,
culture);
res.EndDate = endDate;
res.EndDateSpecified = true;
}
else
{
res.EndDateSpecified = false;
}
}
if (res == null)
{
res = new ScheduleDefinition();
res.StartDateTime = DateTime.Today;
res.EndDateSpecified = false;
}
return res;
}
static private string [] WHICH_WEEK_STRINGS = new string [] {
"FIRST_WEEK",
"SECOND_WEEK",
"THIRD_WEEK",
"FOURTH_WEEK",
"LAST_WEEK"
};
static private string [] WHICH_WEEK_ENUM = new string [] {
WeekNumberEnum.FirstWeek.ToString(),
WeekNumberEnum.SecondWeek.ToString(),
WeekNumberEnum.ThirdWeek.ToString(),
WeekNumberEnum.FourthWeek.ToString(),
WeekNumberEnum.LastWeek.ToString()};
Dmitry Nechipor.
"SouthFLBoiler@.discussions.microsoft.com"
<SouthFLBoilerdiscussionsmicrosoftcom@.discussions.microsoft.com> wrote in
message news:83278D35-A056-4E12-91AF-67FA443CE248@.microsoft.com...
>I got deserializing to work, but the problem is; If I create the schedule
> using the web interface it will not work, but if I do it using my
> interface
> it works.
>
> The XML that is returned from my subscription reports:
>
> "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScheduleDefinition
> xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
> xmlns:xsi=\"/n">http://www.w3.org/2001/XMLSchema-instance\">\n <StartDateTime
> xmlns=\"2005-03-25T13:24:26.4506144-05:00</StartDateTime>/n">http://schemas.microsoft.com/sqlserver/2003/12/reporting/reportingservices\">2005-03-25T13:24:26.4506144-05:00</StartDateTime>\n
> <EndDate
> xmlns=\"2005-03-25T13:24:26.4506144-05:00</EndDate>/n">http://schemas.microsoft.com/sqlserver/2003/12/reporting/reportingservices\">2005-03-25T13:24:26.4506144-05:00</EndDate>\n
> <MinuteRecurrence
> xmlns=\"/n">http://schemas.microsoft.com/sqlserver/2003/12/reporting/reportingservices\">\n
> <MinutesInterval>900</MinutesInterval>\n
> </MinuteRecurrence>\n</ScheduleDefinition>"
>
> The XML that is returned from a report scheduled using the web app:
>
> "<ScheduleDefinition><StartDateTime>2005-03-25T05:30:00.000-05:00</StartDateTime><MinuteRecurrence><MinutesInterval>105</MinutesInterval></MinuteRecurrence></ScheduleDefinition>"
>
>
> private wsReportingServices.ScheduleDefinition
> DeSerializeSchedule(string XMLString)
> {
>
> MemoryStream vStream = GetStreamFromString(XMLString);
>
> XmlAttributes attrs=new XmlAttributes();
>
> attrs.XmlElements.Add(new
> XmlElementAttribute("MinuteRecurrence",typeof(wsReportingServices.MinuteRecurrence)));
> attrs.XmlElements.Add(new
> XmlElementAttribute("DailyRecurrence",typeof(wsReportingServices.DailyRecurrence)));
> attrs.XmlElements.Add(new
> XmlElementAttribute("WeeklyRecurrence",typeof(wsReportingServices.WeeklyRecurrence)));
> attrs.XmlElements.Add(new
> XmlElementAttribute("MonthlyRecurrence",typeof(wsReportingServices.MonthlyRecurrence)));
> attrs.XmlElements.Add(new
> XmlElementAttribute("MonthlyDOWRecurrence",typeof(wsReportingServices.MonthlyDOWRecurrence)));
>
> XmlAttributeOverrides attrOver=new
> XmlAttributeOverrides();
>
> attrOver.Add(typeof(wsReportingServices.ScheduleDefinition),"ScheduleDefinition",attrs);
>
> XmlSerializer newSr=new
> XmlSerializer(typeof(wsReportingServices.ScheduleDefinition),attrOver);
>
> return
> (wsReportingServices.ScheduleDefinition)newSr.Deserialize(vStream);
> }
>|||I tried the code, and it didnt seem to work.
You left out a couple of things though:
crgUtl. ' I repaced this to check if string was empty.
You also left out the code for GetScheduleOverrides();
I tried the following.. but didnt work: My item object was still null, and
the dates where 1/1/0001
private XmlAttributeOverrides GetScheduleOverrides()
{
XmlAttributes vXMLAtributes=new XmlAttributes();
vXMLAtributes.XmlElements.Add(new
XmlElementAttribute("MinuteRecurrence",typeof(MinuteRecurrence)));
vXMLAtributes.XmlElements.Add(new
XmlElementAttribute("DailyRecurrence",typeof(DailyRecurrence)));
vXMLAtributes.XmlElements.Add(new
XmlElementAttribute("WeeklyRecurrence",typeof(WeeklyRecurrence)));
vXMLAtributes.XmlElements.Add(new
XmlElementAttribute("MonthlyRecurrence",typeof(MonthlyRecurrence)));
vXMLAtributes.XmlElements.Add(new
XmlElementAttribute("MonthlyDOWRecurrence",typeof(MonthlyDOWRecurrence)));
vXMLAtributes.XmlElements.Add(new
XmlElementAttribute("RecurrencePattern",typeof(RecurrencePattern)));
XmlAttributeOverrides vAttrOverrides=new XmlAttributeOverrides();
vAttrOverrides.Add(typeof(ScheduleDefinition),"Item",vXMLAtributes);
return vAttrOverrides;
}
"msnews.microsoft.com" wrote:
> Here is the code that works:
>
> static public ScheduleDefinition GetScheduleDefinition(string
> matchData)
> {
> ScheduleDefinition res = null;
>
> if (!crgUtl.IsEmpty(matchData))
> {
> string endDateStart = "<EndDate>";
> string endDateEnd = "</EndDate>";
> string scheduleString = matchData;
> string endDateString = string.Empty;
> // 1. Find <EndDate> tag and parse it separately,
> because it is not serialized correctly by Microsoft.
> int posStart = matchData.IndexOf(endDateStart);
> int posEnd = matchData.IndexOf(endDateEnd);
> if (posStart != -1 && posEnd != -1)
> {
> endDateString = scheduleString.Substring(
> posStart + endDateStart.Length,
> posEnd - posStart - endDateStart.Length);
>
> scheduleString => scheduleString.Substring(0, posStart)
> + scheduleString.Substring(
> posEnd + endDateEnd.Length,
> scheduleString.Length - posEnd -
> endDateEnd.Length);
> }
>
> // 2. Replace True/False on true/false.
> scheduleString = scheduleString.Replace(">True</",
> ">true</");
> scheduleString = scheduleString.Replace(">False</",
> ">false</");
>
> // 2.1 Replace occurrences of which week item on
> serialized correct value:
> for (int i = 0; i < WHICH_WEEK_ENUM.Length; i++)
> scheduleString => scheduleString.Replace(WHICH_WEEK_STRINGS[i], WHICH_WEEK_ENUM[i]);
>
> // 3. Deserialize ScheduleDefinition.
> Stream stream = null;
> XmlReader xmlReader = null;
> try
> {
> // set overrides options to pass namespace tag
> during deserialization:
> XmlAttributeOverrides overrides => GetScheduleOverrides();
>
> stream = new
> MemoryStream(System.Text.Encoding.Default.GetBytes(scheduleString));
> xmlReader = new XmlTextReader(stream);
>
> XmlSerializer ser = new
> XmlSerializer(typeof(ScheduleDefinition), overrides);
> res => (ScheduleDefinition)ser.Deserialize(xmlReader);
> }
> finally
> {
> if (xmlReader != null) xmlReader.Close();
> if (stream != null) stream.Close();
> }
> if (res == null)
> res = new ScheduleDefinition();
>
> // 4. Parse EndDate.
> DateTime endDate = DateTime.Today;
> if (!crgUtl.IsEmpty(endDateString))
> {
> IFormatProvider culture = new
> CultureInfo("en-US", true);
> endDate = DateTime.Parse(endDateString,
> culture);
>
> res.EndDate = endDate;
> res.EndDateSpecified = true;
> }
> else
> {
> res.EndDateSpecified = false;
> }
> }
>
> if (res == null)
> {
> res = new ScheduleDefinition();
> res.StartDateTime = DateTime.Today;
> res.EndDateSpecified = false;
> }
>
> return res;
> }
>
> static private string [] WHICH_WEEK_STRINGS = new string [] {
> "FIRST_WEEK",
> "SECOND_WEEK",
> "THIRD_WEEK",
> "FOURTH_WEEK",
> "LAST_WEEK"
> };
> static private string [] WHICH_WEEK_ENUM = new string [] {
> WeekNumberEnum.FirstWeek.ToString(),
> WeekNumberEnum.SecondWeek.ToString(),
> WeekNumberEnum.ThirdWeek.ToString(),
> WeekNumberEnum.FourthWeek.ToString(),
> WeekNumberEnum.LastWeek.ToString()};
>
>
> Dmitry Nechipor.
> "SouthFLBoiler@.discussions.microsoft.com"
> <SouthFLBoilerdiscussionsmicrosoftcom@.discussions.microsoft.com> wrote in
> message news:83278D35-A056-4E12-91AF-67FA443CE248@.microsoft.com...
> >I got deserializing to work, but the problem is; If I create the schedule
> > using the web interface it will not work, but if I do it using my
> > interface
> > it works.
> >
> >
> > The XML that is returned from my subscription reports:
> >
> >
> >
> > "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScheduleDefinition
> > xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
> > xmlns:xsi=\"/n">http://www.w3.org/2001/XMLSchema-instance\">\n <StartDateTime
> > xmlns=\"2005-03-25T13:24:26.4506144-05:00</StartDateTime>/n">http://schemas.microsoft.com/sqlserver/2003/12/reporting/reportingservices\">2005-03-25T13:24:26.4506144-05:00</StartDateTime>\n
> > <EndDate
> > xmlns=\"2005-03-25T13:24:26.4506144-05:00</EndDate>/n">http://schemas.microsoft.com/sqlserver/2003/12/reporting/reportingservices\">2005-03-25T13:24:26.4506144-05:00</EndDate>\n
> > <MinuteRecurrence
> > xmlns=\"/n">http://schemas.microsoft.com/sqlserver/2003/12/reporting/reportingservices\">\n
> > <MinutesInterval>900</MinutesInterval>\n
> > </MinuteRecurrence>\n</ScheduleDefinition>"
> >
> >
> >
> > The XML that is returned from a report scheduled using the web app:
> >
> >
> >
> > "<ScheduleDefinition><StartDateTime>2005-03-25T05:30:00.000-05:00</StartDateTime><MinuteRecurrence><MinutesInterval>105</MinutesInterval></MinuteRecurrence></ScheduleDefinition>"
> >
> >
> >
> >
> >
> > private wsReportingServices.ScheduleDefinition
> > DeSerializeSchedule(string XMLString)
> >
> > {
> >
> >
> >
> > MemoryStream vStream = GetStreamFromString(XMLString);
> >
> >
> >
> > XmlAttributes attrs=new XmlAttributes();
> >
> >
> >
> > attrs.XmlElements.Add(new
> > XmlElementAttribute("MinuteRecurrence",typeof(wsReportingServices.MinuteRecurrence)));
> >
> > attrs.XmlElements.Add(new
> > XmlElementAttribute("DailyRecurrence",typeof(wsReportingServices.DailyRecurrence)));
> >
> > attrs.XmlElements.Add(new
> > XmlElementAttribute("WeeklyRecurrence",typeof(wsReportingServices.WeeklyRecurrence)));
> >
> > attrs.XmlElements.Add(new
> > XmlElementAttribute("MonthlyRecurrence",typeof(wsReportingServices.MonthlyRecurrence)));
> >
> > attrs.XmlElements.Add(new
> > XmlElementAttribute("MonthlyDOWRecurrence",typeof(wsReportingServices.MonthlyDOWRecurrence)));
> >
> >
> >
> > XmlAttributeOverrides attrOver=new
> > XmlAttributeOverrides();
> >
> >
> > attrOver.Add(typeof(wsReportingServices.ScheduleDefinition),"ScheduleDefinition",attrs);
> >
> >
> > XmlSerializer newSr=new
> > XmlSerializer(typeof(wsReportingServices.ScheduleDefinition),attrOver);
> >
> >
> >
> > return
> > (wsReportingServices.ScheduleDefinition)newSr.Deserialize(vStream);
> >
> > }
> >
>
>|||This is a multi-part message in MIME format.
--=_NextPart_000_0007_01C532E3.673356F0
Content-Type: text/plain;
charset="Utf-8"
Content-Transfer-Encoding: quoted-printable
1. static private XmlAttributeOverrides GetScheduleOverrides()
{
XmlAttributeOverrides overrides =3D new XmlAttributeOverrides();
XmlAttributes attrs =3D new XmlAttributes();
attrs.Xmlns =3D false;
overrides.Add(typeof(ScheduleDefinition), attrs);
overrides.Add(typeof(MinuteRecurrence), attrs);
overrides.Add(typeof(WeeklyRecurrence), attrs);
overrides.Add(typeof(MonthlyRecurrence), attrs);
overrides.Add(typeof(MonthlyDOWRecurrence), attrs);
overrides.Add(typeof(DaysOfWeekSelector), attrs);
overrides.Add(typeof(MonthsOfYearSelector), attrs);
return overrides;
}
2. static public bool IsEmpty(string s)
{
return (s =3D=3D null || s =3D=3D String.Empty);
}
I hope it will help you. I checked it with you string. It deserializes =correctly.
"SouthFLBoiler@.discussions.microsoft.com" =<SouthFLBoilerdiscussionsmicrosoftcom@.discussions.microsoft.com> wrote =in message news:8F51D612-BC59-4547-A4EC-6D6A39BDE532@.microsoft.com...
>I tried the code, and it didnt seem to work.
> > You left out a couple of things though:
> crgUtl. ' I repaced this to check if string was empty.
> > You also left out the code for GetScheduleOverrides();
> > I tried the following.. but didnt work: My item object was still null, =and > the dates where 1/1/0001
> > private XmlAttributeOverrides GetScheduleOverrides()
> {
> XmlAttributes vXMLAtributes=3Dnew XmlAttributes();
> vXMLAtributes.XmlElements.Add(new > XmlElementAttribute("MinuteRecurrence",typeof(MinuteRecurrence)));
> vXMLAtributes.XmlElements.Add(new > XmlElementAttribute("DailyRecurrence",typeof(DailyRecurrence)));
> vXMLAtributes.XmlElements.Add(new > XmlElementAttribute("WeeklyRecurrence",typeof(WeeklyRecurrence)));
> vXMLAtributes.XmlElements.Add(new > XmlElementAttribute("MonthlyRecurrence",typeof(MonthlyRecurrence)));
> vXMLAtributes.XmlElements.Add(new > =XmlElementAttribute("MonthlyDOWRecurrence",typeof(MonthlyDOWRecurrence)))=;
> vXMLAtributes.XmlElements.Add(new > XmlElementAttribute("RecurrencePattern",typeof(RecurrencePattern)));
> > XmlAttributeOverrides vAttrOverrides=3Dnew XmlAttributeOverrides();
> vAttrOverrides.Add(typeof(ScheduleDefinition),"Item",vXMLAtributes);
> return vAttrOverrides;
> }
> > "msnews.microsoft.com" wrote:
> >> Here is the code that works:
>> >> >> >> static public ScheduleDefinition =GetScheduleDefinition(string >> matchData)
>> >> {
>> >> ScheduleDefinition res =3D null;
>> >> >> >> if (!crgUtl.IsEmpty(matchData))
>> >> {
>> >> string endDateStart =3D "<EndDate>";
>> >> string endDateEnd =3D "</EndDate>";
>> >> string scheduleString =3D matchData;
>> >> string endDateString =3D string.Empty;
>> >> // 1. Find <EndDate> tag and parse it =separately, >> because it is not serialized correctly by Microsoft.
>> >> int posStart =3D =matchData.IndexOf(endDateStart);
>> >> int posEnd =3D matchData.IndexOf(endDateEnd);
>> >> if (posStart !=3D -1 && posEnd !=3D -1)
>> >> {
>> >> endDateString =3D =scheduleString.Substring(
>> >> posStart + endDateStart.Length,
>> >> posEnd - posStart - =endDateStart.Length);
>> >> >> >> scheduleString =3D
>> >> scheduleString.Substring(0, =posStart)
>> >> + scheduleString.Substring(
>> >> posEnd + endDateEnd.Length,
>> >> scheduleString.Length - posEnd - >> endDateEnd.Length);
>> >> }
>> >> >> >> // 2. Replace True/False on true/false.
>> >> scheduleString =3D =scheduleString.Replace(">True</", >> ">true</");
>> >> scheduleString =3D =scheduleString.Replace(">False</", >> ">false</");
>> >> >> >> // 2.1 Replace occurrences of which week item =on >> serialized correct value:
>> >> for (int i =3D 0; i < WHICH_WEEK_ENUM.Length; =i++)
>> >> scheduleString =3D >> scheduleString.Replace(WHICH_WEEK_STRINGS[i], WHICH_WEEK_ENUM[i]);
>> >> >> >> // 3. Deserialize ScheduleDefinition.
>> >> Stream stream =3D null;
>> >> XmlReader xmlReader =3D null;
>> >> try
>> >> {
>> >> // set overrides options to pass =namespace tag >> during deserialization:
>> >> XmlAttributeOverrides overrides =3D >> GetScheduleOverrides();
>> >> >> >> stream =3D new >> MemoryStream(System.Text.Encoding.Default.GetBytes(scheduleString));
>> >> xmlReader =3D new XmlTextReader(stream);
>> >> >> >> XmlSerializer ser =3D new >> XmlSerializer(typeof(ScheduleDefinition), overrides);
>> >> res =3D >> (ScheduleDefinition)ser.Deserialize(xmlReader);
>> >> }
>> >> finally
>> >> {
>> >> if (xmlReader !=3D null) =xmlReader.Close();
>> >> if (stream !=3D null) stream.Close();
>> >> }
>> >> if (res =3D=3D null)
>> >> res =3D new ScheduleDefinition();
>> >> >> >> // 4. Parse EndDate.
>> >> DateTime endDate =3D DateTime.Today;
>> >> if (!crgUtl.IsEmpty(endDateString))
>> >> {
>> >> IFormatProvider culture =3D new >> CultureInfo("en-US", true);
>> >> endDate =3D =DateTime.Parse(endDateString, >> culture);
>> >> >> >> res.EndDate =3D endDate;
>> >> res.EndDateSpecified =3D true;
>> >> }
>> >> else
>> >> {
>> >> res.EndDateSpecified =3D false;
>> >> }
>> >> }
>> >> >> >> if (res =3D=3D null)
>> >> {
>> >> res =3D new ScheduleDefinition();
>> >> res.StartDateTime =3D DateTime.Today;
>> >> res.EndDateSpecified =3D false;
>> >> }
>> >> >> >> return res;
>> >> }
>> >> >> >> static private string [] WHICH_WEEK_STRINGS =3D new =string [] {
>> >> "FIRST_WEEK",
>> >> "SECOND_WEEK",
>> >> "THIRD_WEEK",
>> >> "FOURTH_WEEK",
>> >> "LAST_WEEK"
>> >> };
>> >> static private string [] WHICH_WEEK_ENUM =3D new string =[] {
>> >> WeekNumberEnum.FirstWeek.ToString(),
>> >> WeekNumberEnum.SecondWeek.ToString(),
>> >> WeekNumberEnum.ThirdWeek.ToString(),
>> >> WeekNumberEnum.FourthWeek.ToString(),
>> >> WeekNumberEnum.LastWeek.ToString()};
>> >> >> >> >> Dmitry Nechipor.
>> >> "SouthFLBoiler@.discussions.microsoft.com" >> <SouthFLBoilerdiscussionsmicrosoftcom@.discussions.microsoft.com> =wrote in >> message news:83278D35-A056-4E12-91AF-67FA443CE248@.microsoft.com...
>> >I got deserializing to work, but the problem is; If I create the =schedule
>> > using the web interface it will not work, but if I do it using my >> > interface
>> > it works.
>> >
>> >
>> > The XML that is returned from my subscription reports:
>> >
>> >
>> >
>> > "<?xml version=3D\"1.0\" =encoding=3D\"utf-8\"?>\n<ScheduleDefinition
>> > xmlns:xsd=3D\"http://www.w3.org/2001/XMLSchema\"
>> > xmlns:xsi=3D\"/n">http://www.w3.org/2001/XMLSchema-instance\">\n =<StartDateTime
>> > =xmlns=3D\"http://schemas.microsoft.com/sqlserver/2003/12/reporting/report=
ingservices\">2005-03-25T13:24:26.4506144-05:00</StartDateTime>\n
>> > <EndDate
>> > =xmlns=3D\"http://schemas.microsoft.com/sqlserver/2003/12/reporting/report=
ingservices\">2005-03-25T13:24:26.4506144-05:00</EndDate>\n
>> > <MinuteRecurrence
>> > =xmlns=3D\"http://schemas.microsoft.com/sqlserver/2003/12/reporting/report=
ingservices\">\n
>> > <MinutesInterval>900</MinutesInterval>\n
>> > </MinuteRecurrence>\n</ScheduleDefinition>"
>> >
>> >
>> >
>> > The XML that is returned from a report scheduled using the web app:
>> >
>> >
>> >
>> > ="<ScheduleDefinition><StartDateTime>2005-03-25T05:30:00.000-05:00</StartD=ateTime><MinuteRecurrence><MinutesInterval>105</MinutesInterval></MinuteR=ecurrence></ScheduleDefinition>"
>> >
>> >
>> >
>> >
>> >
>> > private wsReportingServices.ScheduleDefinition
>> > DeSerializeSchedule(string XMLString)
>> >
>> > {
>> >
>> >
>> >
>> > MemoryStream vStream =3D =GetStreamFromString(XMLString);
>> >
>> >
>> >
>> > XmlAttributes attrs=3Dnew XmlAttributes();
>> >
>> >
>> >
>> > attrs.XmlElements.Add(new
>> > =XmlElementAttribute("MinuteRecurrence",typeof(wsReportingServices.MinuteR=ecurrence)));
>> >
>> > attrs.XmlElements.Add(new
>> > =XmlElementAttribute("DailyRecurrence",typeof(wsReportingServices.DailyRec=urrence)));
>> >
>> > attrs.XmlElements.Add(new
>> > =XmlElementAttribute("WeeklyRecurrence",typeof(wsReportingServices.WeeklyR=ecurrence)));
>> >
>> > attrs.XmlElements.Add(new
>> > =XmlElementAttribute("MonthlyRecurrence",typeof(wsReportingServices.Monthl=yRecurrence)));
>> >
>> > attrs.XmlElements.Add(new
>> > =XmlElementAttribute("MonthlyDOWRecurrence",typeof(wsReportingServices.Mon=thlyDOWRecurrence)));
>> >
>> >
>> >
>> > XmlAttributeOverrides attrOver=3Dnew >> > XmlAttributeOverrides();
>> >
>> >
>> > =attrOver.Add(typeof(wsReportingServices.ScheduleDefinition),"ScheduleDefi=nition",attrs);
>> >
>> >
>> > XmlSerializer newSr=3Dnew
>> > =XmlSerializer(typeof(wsReportingServices.ScheduleDefinition),attrOver);
>> >
>> >
>> >
>> > return
>> > (wsReportingServices.ScheduleDefinition)newSr.Deserialize(vStream);
>> >
>> > }
>> > >> >> --=_NextPart_000_0007_01C532E3.673356F0
Content-Type: text/html;
charset="Utf-8"
Content-Transfer-Encoding: quoted-printable
=EF=BB=BF<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
&

1.
static =private =XmlAttributeOverrides GetScheduleOverrides()
{
XmlAttributeOverrides overrides =3D new XmlAttributeOverrides();
XmlAttributes attrs =3D new XmlAttributes();
attrs.Xmlns =3D false;
overrides.Add(typeof(ScheduleDefinition), attrs);
overrides.Add(typeof(MinuteRecurrence), attrs);
overrides.Add(typeof(WeeklyRecurrence), attrs);
overrides.Add(typeof(MonthlyRecurrence), attrs);
overrides.Add(typeof(MonthlyDOWRecurrence), attrs);
overrides.Add(typeof(DaysOfWeekSelector), attrs);
overrides.Add(typeof(MonthsOfYearSelector), attrs);
return overrides;
}
2.
static public bool =IsEmpty(string s)
{
return (s =3D=3D null || s =3D=3D String.Empty);
}
I hope it will help you. I checked it with you =string. It deserializes correctly.
"SouthFLBoiler@.discussions.microsoft.com" wrote in message news:8F51D612-BC59-4547-A4EC-6D6A39BDE532@.microsoft.com...>I =tried the code, and it didnt seem to work.> > You left out a couple of =things though:> crgUtl. ' I repaced this to check if string =was empty.> > You also left out the code for GetScheduleOverrides();> > I tried the following.. but =didnt work: My item object was still null, and > the dates where =1/1/0001> > private XmlAttributeOverrides GetScheduleOverrides()> ={> XmlAttributes vXMLAtributes=3Dnew XmlAttributes();> vXMLAtributes.XmlElements.Add(new > XmlElementAttribute("MinuteRecurrence",typeof(MinuteRecurrence)));>=; vXMLAtributes.XmlElements.Add(new > XmlElementAttribute("DailyRecurrence",typeof(DailyRecurrence)));> =vXMLAtributes.XmlElements.Add(new > XmlElementAttribute("WeeklyRecurrence",typeof(WeeklyRecurrence)));>=; vXMLAtributes.XmlElements.Add(new > XmlElementAttribute("MonthlyRecurrence",typeof(MonthlyRecurrence)));&=gt; vXMLAtributes.XmlElements.Add(new > XmlElementAttribute("MonthlyDOWRecurrence",typeof(MonthlyDOWRecurrence)))=;> vXMLAtributes.XmlElements.Add(new > XmlElementAttribute("RecurrencePattern",typeof(RecurrencePattern)));&=gt; > XmlAttributeOverrides vAttrOverrides=3Dnew XmlAttributeOverrides();> vAttrOverrides.Add(typeof(ScheduleDefinition),"Item",vXMLAtributes);&=gt; return vAttrOverrides;> }> > "msnews.microsoft.com" =wrote:> > Here is the code that works:> > > > &=nbsp; static public ScheduleDefinition GetScheduleDefinition(string => matchData)> > &=nbsp; {> > &=nbsp; ScheduleDefinition res =3D null;> > > > &=nbsp; if (!crgUtl.IsEmpty(matchData))> > &=nbsp; {> > &=nbsp; &n=bsp; string endDateStart =3D "";> > &=nbsp; &n=bsp; string endDateEnd =3D "";> > &=nbsp; &n=bsp; string scheduleString =3D matchData;> > &=nbsp; &n=bsp; string endDateString =3D string.Empty;> > &=nbsp; &n=bsp; // 1. Find tag and parse it separately, > =because it is not serialized correctly by Microsoft.> > &=nbsp; &n=bsp; int posStart =3D matchData.IndexOf(endDateStart);> > &=nbsp; &n=bsp; int posEnd =3D matchData.IndexOf(endDateEnd);> > &=nbsp; &n=bsp; if (posStart !=3D -1 && posEnd !=3D -1)> > &=nbsp; &n=bsp; {> > &=nbsp; &n=bsp; endDateString =3D scheduleString.Substring(> > &=nbsp; &n=bsp; &nb=sp; posStart + endDateStart.Length,> > &=nbsp; &n=bsp; &nb=sp; posEnd - posStart - endDateStart.Length);> > => > &=nbsp; &n=bsp; scheduleString =3D> > &=nbsp; &n=bsp; &nb=sp; scheduleString.Substring(0, posStart)> > &=nbsp; &n=bsp; &nb=sp; + scheduleString.Substring(> > &=nbsp; &n=bsp; &nb=sp; posEnd + endDateEnd.Length,> > &=nbsp; &n=bsp; &nb=sp; scheduleString.Length - posEnd - > =endDateEnd.Length);> > &=nbsp; &n=bsp; }> > > > &=nbsp; &n=bsp; // 2. Replace True/False on true/false.> > &=nbsp; &n=bsp; scheduleString =3D scheduleString.Replace(">True ">true > &=nbsp; &n=bsp; scheduleString =3D scheduleString.Replace(">False =">false > > > &=nbsp; &n=bsp; // 2.1 Replace occurrences of which week item on > serialized =correct value:> > &=nbsp; &n=bsp; for (int i =3D 0; i < WHICH_WEEK_ENUM.Length; i++)> > &=nbsp; &n=bsp; scheduleString =3D > =scheduleString.Replace(WHICH_WEEK_STRINGS[i], WHICH_WEEK_ENUM[i]);> > > > &=nbsp; &n=bsp; // 3. Deserialize ScheduleDefinition.> > &=nbsp; &n=bsp; Stream stream =3D null;> > &=nbsp; &n=bsp; XmlReader xmlReader =3D null;> > &=nbsp; &n=bsp; try> > &=nbsp; &n=bsp; {> > &=nbsp; &n=bsp; // set overrides options to pass namespace tag > during deserialization:> > &=nbsp; &n=bsp; XmlAttributeOverrides overrides =3D > GetScheduleOverrides();> > > > &=nbsp; &n=bsp; stream =3D new > MemoryStream(System.Text.Encoding.Default.GetBytes(scheduleString));&=gt;> > &=nbsp; &n=bsp; xmlReader =3D new XmlTextReader(stream);> > => > &=nbsp; &n=bsp; XmlSerializer ser =3D new > =XmlSerializer(typeof(ScheduleDefinition), overrides);> > &=nbsp; &n=bsp; res =3D > =(ScheduleDefinition)ser.Deserialize(xmlReader);> > &=nbsp; &n=bsp; }> > &=nbsp; &n=bsp; finally> > &=nbsp; &n=bsp; {> > &=nbsp; &n=bsp; if (xmlReader !=3D null) xmlReader.Close();> > &=nbsp; &n=bsp; if (stream !=3D null) stream.Close();> > &=nbsp; &n=bsp; }> > &=nbsp; &n=bsp; if (res =3D=3D null)> > &=nbsp; &n=bsp; res =3D new ScheduleDefinition();> > > > &=nbsp; &n=bsp; // 4. Parse EndDate.> > &=nbsp; &n=bsp; DateTime endDate =3D DateTime.Today;> > &=nbsp; &n=bsp; if (!crgUtl.IsEmpty(endDateString))> > &=nbsp; &n=bsp; {> > &=nbsp; &n=bsp; IFormatProvider culture =3D new > CultureInfo("en-US", true);> > &=nbsp; &n=bsp; endDate =3D DateTime.Parse(endDateString, > =culture);> > > > &=nbsp; &n=bsp; res.EndDate =3D endDate;> > &=nbsp; &n=bsp; res.EndDateSpecified =3D true;> > &=nbsp; &n=bsp; }> > &=nbsp; &n=bsp; else> > &=nbsp; &n=bsp; {> > &=nbsp; &n=bsp; res.EndDateSpecified =3D false;> > &=nbsp; &n=bsp; }> > &=nbsp; }> > > > &=nbsp; if (res =3D=3D null)> > &=nbsp; {> > &=nbsp; &n=bsp; res =3D new ScheduleDefinition();> > &=nbsp; &n=bsp; res.StartDateTime =3D DateTime.Today;> > &=nbsp; &n=bsp; res.EndDateSpecified =3D false;> > &=nbsp; }> > > > &=nbsp; return res;> > &=nbsp; }> > > > &=nbsp; static private string [] WHICH_WEEK_STRINGS =3D new string [] ={> > "FIRST_WEEK",> > "SECOND_WEEK",> > ="THIRD_WEEK",> > "FOURTH_WEEK",> > ="LAST_WEEK"> > };> > &=nbsp; static private string [] WHICH_WEEK_ENUM =3D new string [] {> => WeekNumberEnum.FirstWeek.ToString(),> > WeekNumberEnum.SecondWeek.ToString(),> > WeekNumberEnum.ThirdWeek.ToString(),> > WeekNumberEnum.FourthWeek.ToString(),> > WeekNumberEnum.LastWeek.ToString()};> > => > > Dmitry Nechipor.> > ="SouthFLBoiler@.discussions.microsoft.com" > wrote in > message news:83278D35-A056-4E12-91AF-67FA443CE248@.microsoft.com...> >I got deserializing to work, =but the problem is; If I create the schedule> > using the web =interface it will not work, but if I do it using my > > =interface> > it works.> >> >> > The =XML that is returned from my subscription reports:> >> >> >> > "\n > xmlns:xsd=3D\""> > xmlns:xsi=3D\"http://www.w3.org/2001/XMLSchema-instance\">\n'>/nhttp://www.w3.org/2001/XMLSchema-instance\">\n > =xmlns=3D\"2005-03-25T13:24:26.4506144-05:00\n'>http://schemas.microsoft.com/sqlserver/2003/12/reporting/reporti=ngservices\">2005-03-25T13:24:26.4506144-05:00\n=> > > =xmlns=3D\"2005-03-25T13:24:26.4506144-05:00\n'>http://schemas.microsoft.com/sqlserver/2003/12/reporting/reporti=ngservices\">2005-03-25T13:24:26.4506144-05:00\n> > => xmlns=3D\"\n'>http://schemas.microsoft.com/sqlserver/2003/12/reporting/reporti=ngservices\">\n> > 900\n> > \n"> >> >> >> > The XML that is =returned from a report scheduled using the web app:> >> >> >> > "2005-03-25T05:30:00.000-0=5:00=105"> >> >> >> >> >> > =private wsReportingServices.ScheduleDefinition> > DeSerializeSchedule(string XMLString)> >> > &nb=sp; {> >> >> >> > &nb=sp; MemoryStream vStream =3D GetStreamFromString(XMLString);> >> >> >> > &nb=sp; XmlAttributes attrs=3Dnew XmlAttributes();> >> >> >> > &nb=sp; attrs.XmlElements.Add(new> > XmlElementAttribute("MinuteRecurrence",typeof(wsReportingServices.MinuteR=ecurrence)));> >> > &nb=sp; attrs.XmlElements.Add(new> > XmlElementAttribute("DailyRecurrence",typeof(wsReportingServices.DailyRec=urrence)));> >> > &nb=sp; attrs.XmlElements.Add(new> > XmlElementAttribute("WeeklyRecurrence",typeof(wsReportingServices.WeeklyR=ecurrence)));> >> > &nb=sp; attrs.XmlElements.Add(new> > XmlElementAttribute("MonthlyRecurrence",typeof(wsReportingServices.Monthl=yRecurrence)));> >> > &nb=sp; attrs.XmlElements.Add(new> > XmlElementAttribute("MonthlyDOWRecurrence",typeof(wsReportingServices.Mon=thlyDOWRecurrence)));> >> >> >> > &nb=sp; XmlAttributeOverrides attrOver=3Dnew > > XmlAttributeOverrides();> >> >> => attrOver.Add(typeof(wsReportingServices.ScheduleDefinition),"ScheduleDefi=nition",attrs);> >> >> > &nb=sp; XmlSerializer newSr=3Dnew> > XmlSerializer(typeof(wsReportingServices.ScheduleDefinition),attrOver);> >> >> >> > &nb=sp; return> > (wsReportingServices.ScheduleDefinition)newSr.Deserialize(vStream);&g=t;> >> > &nb=sp; }> > > > =>

--=_NextPart_000_0007_01C532E3.673356F0--|||Ok.. that worked on the Schedules made by the web app, but it errors on the
schedules I make with my serialization.
So im check to see if the xml starts with <?xml .. if so, I use my original
deserializion, im not, I use the one you posted
Thanks
"Dmitry Nechipor. [MCDBA]" wrote:
> 1.
> static private XmlAttributeOverrides GetScheduleOverrides()
> {
> XmlAttributeOverrides overrides = new XmlAttributeOverrides();
> XmlAttributes attrs = new XmlAttributes();
> attrs.Xmlns = false;
> overrides.Add(typeof(ScheduleDefinition), attrs);
> overrides.Add(typeof(MinuteRecurrence), attrs);
> overrides.Add(typeof(WeeklyRecurrence), attrs);
> overrides.Add(typeof(MonthlyRecurrence), attrs);
> overrides.Add(typeof(MonthlyDOWRecurrence), attrs);
> overrides.Add(typeof(DaysOfWeekSelector), attrs);
> overrides.Add(typeof(MonthsOfYearSelector), attrs);
> return overrides;
> }
> 2.
> static public bool IsEmpty(string s)
> {
> return (s == null || s == String.Empty);
> }
> I hope it will help you. I checked it with you string. It deserializes correctly.
> "SouthFLBoiler@.discussions.microsoft.com" <SouthFLBoilerdiscussionsmicrosoftcom@.discussions.microsoft.com> wrote in message news:8F51D612-BC59-4547-A4EC-6D6A39BDE532@.microsoft.com...
> >I tried the code, and it didnt seem to work.
> >
> > You left out a couple of things though:
> > crgUtl. ' I repaced this to check if string was empty.
> >
> > You also left out the code for GetScheduleOverrides();
> >
> > I tried the following.. but didnt work: My item object was still null, and
> > the dates where 1/1/0001
> >
> > private XmlAttributeOverrides GetScheduleOverrides()
> > {
> > XmlAttributes vXMLAtributes=new XmlAttributes();
> > vXMLAtributes.XmlElements.Add(new
> > XmlElementAttribute("MinuteRecurrence",typeof(MinuteRecurrence)));
> > vXMLAtributes.XmlElements.Add(new
> > XmlElementAttribute("DailyRecurrence",typeof(DailyRecurrence)));
> > vXMLAtributes.XmlElements.Add(new
> > XmlElementAttribute("WeeklyRecurrence",typeof(WeeklyRecurrence)));
> > vXMLAtributes.XmlElements.Add(new
> > XmlElementAttribute("MonthlyRecurrence",typeof(MonthlyRecurrence)));
> > vXMLAtributes.XmlElements.Add(new
> > XmlElementAttribute("MonthlyDOWRecurrence",typeof(MonthlyDOWRecurrence)));
> > vXMLAtributes.XmlElements.Add(new
> > XmlElementAttribute("RecurrencePattern",typeof(RecurrencePattern)));
> >
> > XmlAttributeOverrides vAttrOverrides=new XmlAttributeOverrides();
> > vAttrOverrides.Add(typeof(ScheduleDefinition),"Item",vXMLAtributes);
> > return vAttrOverrides;
> > }
> >
> > "msnews.microsoft.com" wrote:
> >
> >> Here is the code that works:
> >>
> >>
> >>
> >> static public ScheduleDefinition GetScheduleDefinition(string
> >> matchData)
> >>
> >> {
> >>
> >> ScheduleDefinition res = null;
> >>
> >>
> >>
> >> if (!crgUtl.IsEmpty(matchData))
> >>
> >> {
> >>
> >> string endDateStart = "<EndDate>";
> >>
> >> string endDateEnd = "</EndDate>";
> >>
> >> string scheduleString = matchData;
> >>
> >> string endDateString = string.Empty;
> >>
> >> // 1. Find <EndDate> tag and parse it separately,
> >> because it is not serialized correctly by Microsoft.
> >>
> >> int posStart = matchData.IndexOf(endDateStart);
> >>
> >> int posEnd = matchData.IndexOf(endDateEnd);
> >>
> >> if (posStart != -1 && posEnd != -1)
> >>
> >> {
> >>
> >> endDateString = scheduleString.Substring(
> >>
> >> posStart + endDateStart.Length,
> >>
> >> posEnd - posStart - endDateStart.Length);
> >>
> >>
> >>
> >> scheduleString => >>
> >> scheduleString.Substring(0, posStart)
> >>
> >> + scheduleString.Substring(
> >>
> >> posEnd + endDateEnd.Length,
> >>
> >> scheduleString.Length - posEnd -
> >> endDateEnd.Length);
> >>
> >> }
> >>
> >>
> >>
> >> // 2. Replace True/False on true/false.
> >>
> >> scheduleString = scheduleString.Replace(">True</",
> >> ">true</");
> >>
> >> scheduleString = scheduleString.Replace(">False</",
> >> ">false</");
> >>
> >>
> >>
> >> // 2.1 Replace occurrences of which week item on
> >> serialized correct value:
> >>
> >> for (int i = 0; i < WHICH_WEEK_ENUM.Length; i++)
> >>
> >> scheduleString => >> scheduleString.Replace(WHICH_WEEK_STRINGS[i], WHICH_WEEK_ENUM[i]);
> >>
> >>
> >>
> >> // 3. Deserialize ScheduleDefinition.
> >>
> >> Stream stream = null;
> >>
> >> XmlReader xmlReader = null;
> >>
> >> try
> >>
> >> {
> >>
> >> // set overrides options to pass namespace tag
> >> during deserialization:
> >>
> >> XmlAttributeOverrides overrides => >> GetScheduleOverrides();
> >>
> >>
> >>
> >> stream = new
> >> MemoryStream(System.Text.Encoding.Default.GetBytes(scheduleString));
> >>
> >> xmlReader = new XmlTextReader(stream);
> >>
> >>
> >>
> >> XmlSerializer ser = new
> >> XmlSerializer(typeof(ScheduleDefinition), overrides);
> >>
> >> res => >> (ScheduleDefinition)ser.Deserialize(xmlReader);
> >>
> >> }
> >>
> >> finally
> >>
> >> {
> >>
> >> if (xmlReader != null) xmlReader.Close();
> >>
> >> if (stream != null) stream.Close();
> >>
> >> }
> >>
> >> if (res == null)
> >>
> >> res = new ScheduleDefinition();
> >>
> >>
> >>
> >> // 4. Parse EndDate.
> >>
> >> DateTime endDate = DateTime.Today;
> >>
> >> if (!crgUtl.IsEmpty(endDateString))
> >>
> >> {
> >>
> >> IFormatProvider culture = new
> >> CultureInfo("en-US", true);
> >>
> >> endDate = DateTime.Parse(endDateString,
> >> culture);
> >>
> >>
> >>
> >> res.EndDate = endDate;
> >>
> >> res.EndDateSpecified = true;
> >>
> >> }
> >>
> >> else
> >>
> >> {
> >>
> >> res.EndDateSpecified = false;
> >>
> >> }
> >>
> >> }
> >>
> >>
> >>
> >> if (res == null)
> >>
> >> {
> >>
> >> res = new ScheduleDefinition();
> >>
> >> res.StartDateTime = DateTime.Today;
> >>
> >> res.EndDateSpecified = false;
> >>
> >> }
> >>
> >>
> >>
> >> return res;
> >>
> >> }
> >>
> >>
> >>
> >> static private string [] WHICH_WEEK_STRINGS = new string [] {
> >>
> >> "FIRST_WEEK",
> >>
> >> "SECOND_WEEK",
> >>
> >> "THIRD_WEEK",
> >>
> >> "FOURTH_WEEK",
> >>
> >> "LAST_WEEK"
> >>
> >> };
> >>
> >> static private string [] WHICH_WEEK_ENUM = new string [] {
> >>
> >> WeekNumberEnum.FirstWeek.ToString(),
> >>
> >> WeekNumberEnum.SecondWeek.ToString(),
> >>
> >> WeekNumberEnum.ThirdWeek.ToString(),
> >>
> >> WeekNumberEnum.FourthWeek.ToString(),
> >>
> >> WeekNumberEnum.LastWeek.ToString()};
> >>
> >>
> >>
> >>
> >> Dmitry Nechipor.
> >>
> >> "SouthFLBoiler@.discussions.microsoft.com"
> >> <SouthFLBoilerdiscussionsmicrosoftcom@.discussions.microsoft.com> wrote in
> >> message news:83278D35-A056-4E12-91AF-67FA443CE248@.microsoft.com...
> >> >I got deserializing to work, but the problem is; If I create the schedule
> >> > using the web interface it will not work, but if I do it using my
> >> > interface
> >> > it works.
> >> >
> >> >
> >> > The XML that is returned from my subscription reports:
> >> >
> >> >
> >> >
> >> > "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScheduleDefinition
> >> > xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
> >> > xmlns:xsi=\"/n">http://www.w3.org/2001/XMLSchema-instance\">\n <StartDateTime
> >> > xmlns=\"2005-03-25T13:24:26.4506144-05:00</StartDateTime>/n">http://schemas.microsoft.com/sqlserver/2003/12/reporting/reportingservices\">2005-03-25T13:24:26.4506144-05:00</StartDateTime>\n
> >> > <EndDate
> >> > xmlns=\"2005-03-25T13:24:26.4506144-05:00</EndDate>/n">http://schemas.microsoft.com/sqlserver/2003/12/reporting/reportingservices\">2005-03-25T13:24:26.4506144-05:00</EndDate>\n
> >> > <MinuteRecurrence
> >> > xmlns=\"/n">http://schemas.microsoft.com/sqlserver/2003/12/reporting/reportingservices\">\n
> >> > <MinutesInterval>900</MinutesInterval>\n
> >> > </MinuteRecurrence>\n</ScheduleDefinition>"
> >> >
> >> >
> >> >
> >> > The XML that is returned from a report scheduled using the web app:
> >> >
> >> >
> >> >
> >> > "<ScheduleDefinition><StartDateTime>2005-03-25T05:30:00.000-05:00</StartDateTime><MinuteRecurrence><MinutesInterval>105</MinutesInterval></MinuteRecurrence></ScheduleDefinition>"
> >> >
> >> >
> >> >
> >> >
> >> >
> >> > private wsReportingServices.ScheduleDefinition
> >> > DeSerializeSchedule(string XMLString)
> >> >
> >> > {
> >> >
> >> >
> >> >
> >> > MemoryStream vStream = GetStreamFromString(XMLString);
> >> >
> >> >
> >> >
> >> > XmlAttributes attrs=new XmlAttributes();
> >> >
> >> >
> >> >
> >> > attrs.XmlElements.Add(new
> >> > XmlElementAttribute("MinuteRecurrence",typeof(wsReportingServices.MinuteRecurrence)));
> >> >
> >> > attrs.XmlElements.Add(new
> >> > XmlElementAttribute("DailyRecurrence",typeof(wsReportingServices.DailyRecurrence)));
> >> >
> >> > attrs.XmlElements.Add(new
> >> > XmlElementAttribute("WeeklyRecurrence",typeof(wsReportingServices.WeeklyRecurrence)));
> >> >
> >> > attrs.XmlElements.Add(new
> >> > XmlElementAttribute("MonthlyRecurrence",typeof(wsReportingServices.MonthlyRecurrence)));
> >> >
> >> > attrs.XmlElements.Add(new
> >> > XmlElementAttribute("MonthlyDOWRecurrence",typeof(wsReportingServices.MonthlyDOWRecurrence)));
> >> >
> >> >
> >> >
> >> > XmlAttributeOverrides attrOver=new
> >> > XmlAttributeOverrides();
> >> >
> >> >
> >> > attrOver.Add(typeof(wsReportingServices.ScheduleDefinition),"ScheduleDefinition",attrs);
> >> >
> >> >
> >> > XmlSerializer newSr=new
> >> > XmlSerializer(typeof(wsReportingServices.ScheduleDefinition),attrOver);
> >> >
> >> >
> >> >
> >> > return
> >> > (wsReportingServices.ScheduleDefinition)newSr.Deserialize(vStream);
> >> >
> >> > }
> >> >
> >>
> >>
> >>|||Here's a nice example of serializing ScheduleDefinition:
http://www.odetocode.com/Articles/114.aspx
--
Adrian M.
MCP
"SouthFLBoiler@.discussions.microsoft.com"
<SouthFLBoilerdiscussionsmicrosoftcom@.discussions.microsoft.com> wrote in
message news:83278D35-A056-4E12-91AF-67FA443CE248@.microsoft.com...
>I got deserializing to work, but the problem is; If I create the schedule
> using the web interface it will not work, but if I do it using my
> interface
> it works.
>
> The XML that is returned from my subscription reports:
>
> "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScheduleDefinition
> xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
> xmlns:xsi=\"/n">http://www.w3.org/2001/XMLSchema-instance\">\n <StartDateTime
> xmlns=\"2005-03-25T13:24:26.4506144-05:00</StartDateTime>/n">http://schemas.microsoft.com/sqlserver/2003/12/reporting/reportingservices\">2005-03-25T13:24:26.4506144-05:00</StartDateTime>\n
> <EndDate
> xmlns=\"2005-03-25T13:24:26.4506144-05:00</EndDate>/n">http://schemas.microsoft.com/sqlserver/2003/12/reporting/reportingservices\">2005-03-25T13:24:26.4506144-05:00</EndDate>\n
> <MinuteRecurrence
> xmlns=\"/n">http://schemas.microsoft.com/sqlserver/2003/12/reporting/reportingservices\">\n
> <MinutesInterval>900</MinutesInterval>\n
> </MinuteRecurrence>\n</ScheduleDefinition>"
>
> The XML that is returned from a report scheduled using the web app:
>
> "<ScheduleDefinition><StartDateTime>2005-03-25T05:30:00.000-05:00</StartDateTime><MinuteRecurrence><MinutesInterval>105</MinutesInterval></MinuteRecurrence></ScheduleDefinition>"
>
>
> private wsReportingServices.ScheduleDefinition
> DeSerializeSchedule(string XMLString)
> {
>
> MemoryStream vStream = GetStreamFromString(XMLString);
>
> XmlAttributes attrs=new XmlAttributes();
>
> attrs.XmlElements.Add(new
> XmlElementAttribute("MinuteRecurrence",typeof(wsReportingServices.MinuteRecurrence)));
> attrs.XmlElements.Add(new
> XmlElementAttribute("DailyRecurrence",typeof(wsReportingServices.DailyRecurrence)));
> attrs.XmlElements.Add(new
> XmlElementAttribute("WeeklyRecurrence",typeof(wsReportingServices.WeeklyRecurrence)));
> attrs.XmlElements.Add(new
> XmlElementAttribute("MonthlyRecurrence",typeof(wsReportingServices.MonthlyRecurrence)));
> attrs.XmlElements.Add(new
> XmlElementAttribute("MonthlyDOWRecurrence",typeof(wsReportingServices.MonthlyDOWRecurrence)));
>
> XmlAttributeOverrides attrOver=new
> XmlAttributeOverrides();
>
> attrOver.Add(typeof(wsReportingServices.ScheduleDefinition),"ScheduleDefinition",attrs);
>
> XmlSerializer newSr=new
> XmlSerializer(typeof(wsReportingServices.ScheduleDefinition),attrOver);
>
> return
> (wsReportingServices.ScheduleDefinition)newSr.Deserialize(vStream);
> }
>

deserializing a collection which implements collectionbase

I had a post very similar to this a week or so ago and I received a couple good solutions ... unfortunately, I forgot to mention 1 point that apparently makes a big enough difference so that the solution given won't work. Here's what I originally posted
(and below that is more info):
I'm writing a class in C# ...
I have a collection calls Reports made up of Report objects. I'm trying to deserialize an XML file that looks like :
<Reports>
<Report>
<Title>some title</Title>
<Notes> some notes </Notes>
</Report>
<Report>
blah blah blah
</Report>
</Reports>
I want to be able to deserialize the file in the Reports collection constructor and build the Report objects on the fly. The only examples I've been able to find read the entire XML file outside of the class (which works fine in my test console app), but
I want to be able to be able to dynamically build everything inside the collection class. Do I need to parse through the XML file and got to each <Report> tag and deserialize one Report at a time (and use "this.Add(newReport)")? How can parse the file
like that and pass just that info into the deserialize method? I haven't used XPath, so if I need that, an example would really help.
NOW..........................
what I failed to mention was that my Reports collection implements CollectionBase and now I recieve the following error: "XML attributes may not be specified for the type TestCore.Reports"
I remove the CollectionBase implementation and it works. I've found several websites saying that I can deserialize a class implementing CollectionBase, but I haven't found any examples or help as to what I'm doing wrong. Here's what I have for the colle
ction class using the solution I received in my earlier post (if need be I can post more of my code):
[System.Xml.Serialization.XmlRoot("Reports", Namespace="", IsNullable=false)]
[System.Xml.Serialization.XmlType("Reports", Namespace="")]
public class Reports : CollectionBase
{
[System.Xml.Serialization.XmlElementAttribute "Report",Form=System.Xml.Schema.XmlSchemaForm.Unqu alified)]
public Report[] Items1;
public Reports() {}
public Reports(string path)
{
Reports temp= Reports.CreateFromString(path);
Items1= temp.Items1; // shallow copy of array. Would need to do this for each field in the RC type
// "temp" now goes out of scope but the Items array gets referenced by "this"
}
public static Reports CreateFromString(string xml1)
{
// could parameterize this with a filename, a stream, a string,whatever
XmlSerializer s1 = new XmlSerializer(typeof(Reports));
// slurp it in: deserialize the original XML into a value
System.IO.StringReader sr= new System.IO.StringReader(xml1);
Reports rc= (Reports) s1.Deserialize(new System.Xml.XmlTextReader(sr));
return rc;
}
public int Add(Report report)
{
return List.Add(report);
}
public Report this[int index]
{
get
{
return((Report)List[index]);
}
set
{
List[index] = value;
}
}
}
You need to remove the attributes from the class that derives from
CollectionBase.
The side effect of this is that your collection will now serialize as
<ArrayOfReport>
<Report>...</Report>
...
</ArrayOfReport>
Rather than what you wanted, which was:
<Reports>
<Report>...</Report>
...
</Reports>
To work around this you can specify an XmlRootAttribute() in the serializer.
See here for an example that combines the answer to your 2 most recent asks
(self-instantiation and serializing a CollectionBase):
http://www.winisp.net/cheeso/srcview...lectionBase.cs
Note that the copy in the parameterized constructor is different in this
code that in the prior code, because the "Items1" field is not used. So
here you gotta iterate to do the copy.
-D
Dino Chiesa
Microsoft Developer Division
d i n o c h @. OmitThis . m i c r o s o f t . c o m
"Greg" <Greg@.discussions.microsoft.com> wrote in message
news:59CCBFD6-29FB-40A1-9B9D-09F6A98A983E@.microsoft.com...
> I had a post very similar to this a week or so ago and I received a couple
good solutions ... unfortunately, I forgot to mention 1 point that
apparently makes a big enough difference so that the solution given won't
work. Here's what I originally posted (and below that is more info):
> I'm writing a class in C# ...
> I have a collection calls Reports made up of Report objects. I'm trying
to deserialize an XML file that looks like :
> <Reports>
> <Report>
> <Title>some title</Title>
> <Notes> some notes </Notes>
> </Report>
> <Report>
> blah blah blah
> </Report>
> </Reports>
> I want to be able to deserialize the file in the Reports collection
constructor and build the Report objects on the fly. The only examples I've
been able to find read the entire XML file outside of the class (which works
fine in my test console app), but I want to be able to be able to
dynamically build everything inside the collection class. Do I need to
parse through the XML file and got to each <Report> tag and deserialize one
Report at a time (and use "this.Add(newReport)")? How can parse the file
like that and pass just that info into the deserialize method? I haven't
used XPath, so if I need that, an example would really help.
> NOW..........................
> what I failed to mention was that my Reports collection implements
CollectionBase and now I recieve the following error: "XML attributes may
not be specified for the type TestCore.Reports"
> I remove the CollectionBase implementation and it works. I've found
several websites saying that I can deserialize a class implementing
CollectionBase, but I haven't found any examples or help as to what I'm
doing wrong. Here's what I have for the collection class using the solution
I received in my earlier post (if need be I can post more of my code):
> [System.Xml.Serialization.XmlRoot("Reports", Namespace="",
IsNullable=false)]
> [System.Xml.Serialization.XmlType("Reports", Namespace="")]
> public class Reports : CollectionBase
> {
> [System.Xml.Serialization.XmlElementAttribute
"Report",Form=System.Xml.Schema.XmlSchemaForm.Unqu alified)]
> public Report[] Items1;
> public Reports() {}
> public Reports(string path)
> {
> Reports temp= Reports.CreateFromString(path);
> Items1= temp.Items1; // shallow copy of array. Would need to do
this for each field in the RC type
> // "temp" now goes out of scope but the Items array gets
referenced by "this"
> }
> public static Reports CreateFromString(string xml1)
> {
> // could parameterize this with a filename, a stream, a string,
whatever
> XmlSerializer s1 = new XmlSerializer(typeof(Reports));
> // slurp it in: deserialize the original XML into a value
> System.IO.StringReader sr= new System.IO.StringReader(xml1);
> Reports rc= (Reports) s1.Deserialize(new
System.Xml.XmlTextReader(sr));
> return rc;
> }
> public int Add(Report report)
> {
> return List.Add(report);
> }
> public Report this[int index]
> {
> get
> {
> return((Report)List[index]);
> }
> set
> {
> List[index] = value;
> }
> }
> }
>