By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
459,273 Members | 1,032 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 459,273 IT Pros & Developers. It's quick & easy.

MC++ & C# generate different XML

P: n/a
Hi,

I've been trying a long time now to generate some XML using MC++ and
XmlSerializer. I have a piece of C# code that produces exactly what I want,
but I simply can't get the MC++ code to write the same thing. Below I have
included two minimal compilable samples that illustrate my problem.

The C# code produces this XML:

<?xml version="1.0" encoding="utf-8"?>
<LandXML xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Units name="unit1" />
<Units name="unit2" />
</LandXML>

and the MC++ code produces this:

<?xml version="1.0" encoding="utf-8"?>
<LandXML xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Units>
<Units name="unit1" />
<Units name="unit2" />
</Units>
</LandXML>

Now follows the C# code:

using System;
using System.Xml;
using System.Xml.Serialization;
using System.Collections;

[Serializable]
public class UnitsCollection : ArrayList
{
public Units Add(Units obj) { base.Add(obj); return obj; }
public Units Add() { return Add(new Units()); }
}

[XmlType(TypeName="Units"),XmlRoot,Serializable]
public class Units
{
public Units() { }
[XmlAttribute(AttributeName="name")]
public string __name;
}

[XmlRoot(ElementName="LandXML",IsNullable=false),Se rializable]
public class LandXML
{
public LandXML() { }
[XmlElement(Type=typeof(Units),ElementName="Units", IsNullable=false)]
public UnitsCollection __UnitsCollection;
}

public class HelloWorld
{
public static void Main()
{
LandXML lx = new LandXML();
UnitsCollection units = new UnitsCollection();
Units unit1 = new Units();
Units unit2 = new Units();
unit1.__name = "unit1";
unit2.__name = "unit2";
units.Add(unit1);
units.Add(unit2);

lx.__UnitsCollection = units;

XmlSerializer ser = new XmlSerializer(typeof(LandXML));
XmlTextWriter writer = new XmlTextWriter("c_sharp.xml",
System.Text.Encoding.UTF8);
writer.Formatting = Formatting.Indented;
ser.Serialize(writer, lx);
writer.Close();
}
}

Here is the exact same program written with MC++ (I catch exceptions too):

#using <mscorlib.dll>
#using <System.Xml.dll>
#using <System.Data.dll>
#using <System.dll>

using namespace System;
using namespace System::Xml::Serialization;
using namespace System::Xml;
using namespace System::Data;
using namespace System::Reflection;
using namespace System::Collections;

[XmlRootAttribute(ElementName="Units", IsNullable=false),
SerializableAttribute]
public __gc class Units {
public:
Units() { }
[XmlAttributeAttribute(AttributeName="name")]
System::String* __name;
};

/*
* If I switch Index for Item which I think is what should be used
* I can't compile because of error C2392:
* covariant returns types are not supported in managed types
*/
[SerializableAttribute, DefaultMemberAttribute("Index")]
public __gc class UnitsCollection : public ArrayList
{
public:
UnitsCollection() { }

Units* Add(Units* obj) { __super::Add(obj); return obj; }
Units* Add() { return Add(new Units()); }
void Insert(int index, Units* obj) { __super::Insert(index, obj); }
void Remove(Units* obj) { __super::Remove(obj); }
__property Units* get_Index(int index) { return
static_cast<Units*>(__super::Item[index]); }
__property void set_Index(int index, Units* u) { __super::Item[index] =
u; }
};

[XmlRootAttribute(ElementName="LandXML", IsNullable=false),
SerializableAttribute]
public __gc class LandXML {
public:
LandXML() { }

[XmlElement(Type=__typeof(UnitsCollection),ElementN ame="Units",IsNullable=false)]
UnitsCollection* __UnitsCollection;
};

void WriteExceptionInfo(Exception*);

int main()
{
try {

LandXML* lx = new LandXML();
UnitsCollection* units = new UnitsCollection;
Units* unit1 = new Units();
Units* unit2 = new Units();
unit1->__name = "unit1";
unit2->__name = "unit2";
units->Add(unit1);
units->Add(unit2);
lx->__UnitsCollection = units;

XmlSerializer* ser = new XmlSerializer(__typeof(LandXML));
XmlTextWriter* writer = new XmlTextWriter("mc++.xml",
System::Text::Encoding::UTF8);
writer->Formatting = Formatting::Indented;
ser->Serialize(writer, lx);
writer->Close();
}
catch( System::Exception* ex ) {
WriteExceptionInfo(ex);
if( ex!=0 )
WriteExceptionInfo(ex->InnerException);
}

return 0;
}

void WriteExceptionInfo(System::Exception* ex)
{
System::Console::WriteLine( "--------- Exception Data ---------" );
System::Console::WriteLine( "Message: {0}", ex->Message );
System::Console::WriteLine( "Exception Type: {0}",
ex->GetType()->FullName );
System::Console::WriteLine( "Source: {0}", ex->Source );
System::Console::WriteLine( "StrackTrace: {0}", ex->StackTrace );
System::Console::WriteLine( "TargetSite: {0}", ex->TargetSite );
}
Can anyone explain to me what is going on here? Am I missing something, or
is the XmlSerializer not working correct with MC++?
Thank you.

--
Daniel
Nov 12 '05 #1
Share this Question
Share on Google+
4 Replies


P: n/a
"Daniel Lidström" <so*****@microsoft.com> wrote in message news:8g*****************************@40tude.net...
I have a piece of C# code that produces exactly what I want,
but I simply can't get the MC++ code to write the same thing. : : [XmlType(TypeName="Units"),XmlRoot,Serializable]
public class Units : : [XmlRootAttribute(ElementName="Units", IsNullable=false),
SerializableAttribute]
public __gc class Units { : : Am I missing something, or is the XmlSerializer not working
correct with MC++?


The C# Units class has an XmlTypeAttribute, anonymous XmlRootAttribute,
and SerializableAttribute on it.

The MC++ Units class has an XmlRootAttribute telling it to emit a Units
element, and a SerializableAttribute on it.

Is there some reason these attributes aren't the same between C# and
Managed C++? This could be the cause for receiving the different XML
serializations.
Derek Harmon
Nov 12 '05 #2

P: n/a
"Daniel Lidström" <so*****@microsoft.com> wrote in message news:8g*****************************@40tude.net...
I have a piece of C# code that produces exactly what I want,
but I simply can't get the MC++ code to write the same thing. : : [XmlType(TypeName="Units"),XmlRoot,Serializable]
public class Units : : [XmlRootAttribute(ElementName="Units", IsNullable=false),
SerializableAttribute]
public __gc class Units { : : Am I missing something, or is the XmlSerializer not working
correct with MC++?


The C# Units class has an XmlTypeAttribute, anonymous XmlRootAttribute,
and SerializableAttribute on it.

The MC++ Units class has an XmlRootAttribute telling it to emit a Units
element, and a SerializableAttribute on it.

Is there some reason these attributes aren't the same between C# and
Managed C++? This could be the cause for receiving the different XML
serializations.
Derek Harmon
Nov 12 '05 #3

P: n/a
On Sat, 29 May 2004 19:47:25 -0400, Derek Harmon wrote:
"Daniel Lidström" <so*****@microsoft.com> wrote in message news:8g*****************************@40tude.net...
I have a piece of C# code that produces exactly what I want,
but I simply can't get the MC++ code to write the same thing.

::
[XmlType(TypeName="Units"),XmlRoot,Serializable]
public class Units

::
[XmlRootAttribute(ElementName="Units", IsNullable=false),
SerializableAttribute]
public __gc class Units {

::
Am I missing something, or is the XmlSerializer not working
correct with MC++?


The C# Units class has an XmlTypeAttribute, anonymous XmlRootAttribute,
and SerializableAttribute on it.

The MC++ Units class has an XmlRootAttribute telling it to emit a Units
element, and a SerializableAttribute on it.

Is there some reason these attributes aren't the same between C# and
Managed C++? This could be the cause for receiving the different XML
serializations.


Whatever attribute I put on the MC++ Units class I still get the unexpected
xml output. Has anyone been able to generate this kind of xml using MC++?

<?xml version="1.0" encoding="utf-8"?>
<LandXML xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Units name="unit1" />
<Units name="unit2" />
.... arbitrary number of Units ...
</LandXML>

If so, I would be very happy to see the code that produced it.
Thanks!

--
Daniel
Nov 12 '05 #4

P: n/a
On Sat, 29 May 2004 19:47:25 -0400, Derek Harmon wrote:
"Daniel Lidström" <so*****@microsoft.com> wrote in message news:8g*****************************@40tude.net...
I have a piece of C# code that produces exactly what I want,
but I simply can't get the MC++ code to write the same thing.

::
[XmlType(TypeName="Units"),XmlRoot,Serializable]
public class Units

::
[XmlRootAttribute(ElementName="Units", IsNullable=false),
SerializableAttribute]
public __gc class Units {

::
Am I missing something, or is the XmlSerializer not working
correct with MC++?


The C# Units class has an XmlTypeAttribute, anonymous XmlRootAttribute,
and SerializableAttribute on it.

The MC++ Units class has an XmlRootAttribute telling it to emit a Units
element, and a SerializableAttribute on it.

Is there some reason these attributes aren't the same between C# and
Managed C++? This could be the cause for receiving the different XML
serializations.


Whatever attribute I put on the MC++ Units class I still get the unexpected
xml output. Has anyone been able to generate this kind of xml using MC++?

<?xml version="1.0" encoding="utf-8"?>
<LandXML xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Units name="unit1" />
<Units name="unit2" />
.... arbitrary number of Units ...
</LandXML>

If so, I would be very happy to see the code that produced it.
Thanks!

--
Daniel
Nov 12 '05 #5

This discussion thread is closed

Replies have been disabled for this discussion.