Hey all
I have an object that contains a strongly typed array of sub-objects. I have marked all of the objects as serializable. However initially it wouldnt serialize. So I found online that if I use the XmlInclude attribute that will fix the problem, which it sort of did. It serializes now and the basic object comes across the wire (with web services) just fine. The collection is there and has objects however all the objects are null. Any ideas on what could be wrong
Thanks
Kenzie

XmlInclude works but now my objects dont serialize
proggerFX
Kenzie
.nettled
Could you post your code
Thanks
Poppyto
scuba79
You could see the XmlArrayItemAttribute element, it deals with collection.
Many sample on google
Francis06
Here is the base class for the collection
[
Serializable] public class OrderDescriptor{
#region
Members protected string m_Value = null;#endregion
#region
Properties public string Value{
get { return m_Value; } set { m_Value = value; }}
#endregion
#region
XML Methods public string XMLSerialize(){
string result = null; XmlSerializer serializer = new XmlSerializer(this.GetType()); StringWriter writer = new StringWriter(); try{
serializer.Serialize(
new XmlTextWriter(writer), this);result = writer.ToString();
}
catch (Exception err){
string msg = err.Message;msg +=
" ";}
return result;}
public virtual OrderDescriptor XMLDeSerialize(string xml){
OrderDescriptor result = new OrderDescriptor(); XmlSerializer serializer = new XmlSerializer(this.GetType()); try{
result = (
OrderDescriptor)serializer.Deserialize(new XmlTextReader(new StringReader(xml)));}
catch (Exception err){
string msg = err.Message;msg +=
" ";}
return result;}
#endregion
}
Here is the derived class.
[
Serializable] public class PostalInfo : OrderDescriptor{
#region
Members private string m_OrderID = "0"; private string m_ClassType = null; private string m_PieceType = null; private string m_PostageType = null; private string m_PermitNum = null; private string m_Endorsement = null;#endregion
#region
Properties public string OrderID{
get { return m_OrderID; } set { m_OrderID = value; }}
public string ClassType{
get { return m_ClassType; } set { m_ClassType = value; }}
public string PieceType{
get { return m_PieceType; } set { m_PieceType = value; }}
public string PostageType{
get { return m_PostageType; } set { m_PostageType = value; }}
public string PermitNum{
get { return m_PermitNum; } set { m_PermitNum = value; }}
public string Endorsement{
get { return m_Endorsement; } set { m_Endorsement = value; }}
#endregion
#region
Constructors public PostalInfo(){
// // TODO: Add constructor logic here //}
public PostalInfo(string ID){
// try
// {
// //THIS FUNCTION TAKES A KEY VALUE AND POPULATES A ORDER FROM IT
// //*************************************************************
// Connection.Open();
// Command = new SqlCommand("Select * From PostalInfo WHERE OrderID='" + ID.ToString() + "'", Connection );
// SqlDataReader myReader = Command.ExecuteReader();
// myReader.Read();
// m_OrderID = ID;
// m_ClassType = myReader["ClassType"].ToString();
// m_PieceType = myReader["PieceType"].ToString();
// m_PostageType = myReader["PostageType"].ToString();
// m_PermitNum = myReader["Permit"].ToString();
// m_Endorsement = myReader["Endorsement"].ToString();
// }
// catch (Exception e)
// {
//// Console.WriteLine("Mail Manager Remoting Error:" + e.Message, EventLogEntryType.Error);
//// DataAgent da = new DataAgent();
//// da.SendMail("mackenziemi@skymailint.com", "data@skymailint.com", "Error Report", e);
// }
}
public PostalInfo(string OID, string classtype, string piecetype, string postagetype, string permitnumber, string endorsement){
m_OrderID = OID;
m_ClassType = classtype;
m_PieceType = piecetype;
m_PostageType = postagetype;
m_PermitNum = permitnumber;
m_Endorsement = endorsement;
//Insert();}
#endregion
#region
Methods public PostalInfo XMLDeSerialize(string xml){
PostalInfo result = new PostalInfo(); XmlSerializer serializer = new XmlSerializer(this.GetType()); try{
this.Value = xml; OrderDescriptor od = new OrderDescriptor();od = od.XMLDeSerialize(xml);
result = (
PostalInfo)serializer.Deserialize(new XmlTextReader(new StringReader(od.Value)));}
catch (Exception err){
string msg = err.Message;msg +=
" ";}
return result;}
#endregion
}
}
Here is the collection class
[
XmlInclude(typeof(Skymail.BusinessObjects.OrderDescriptors.PostalInfo))][
XmlInclude(typeof(Skymail.BusinessObjects.OrderDescriptors.ProductionManifest))][
XmlInclude(typeof(Skymail.BusinessObjects.OrderDescriptors.StatusInformation))][
Serializable] public class OrderDescriptors:CollectionBase{
#region
Data Members#endregion
#region
Properties public OrderDescriptor this[int index]{
get{
return (OrderDescriptor)List[index];}
set{
List[index] =
value;}
}
public int Add(OrderDescriptor value){
return List.Add(value);}
public int IndexOf(OrderDescriptor value){
return (List.IndexOf(value));}
public void Insert(int index, OrderDescriptor value){
List.Insert(index, value);
}
public void Remove(OrderDescriptor value){
List.Remove(value);
}
public bool Contains(OrderDescriptor value){
// If value is not of type Int16, this will return false. return (List.Contains(value));}
#endregion
#region
Event Methods protected override void OnInsert(int index, Object value){
// Insert additional code to be run only when inserting values.}
protected override void OnRemove(int index, Object value){
// Insert additional code to be run only when removing values.}
protected override void OnSet(int index, Object oldValue, Object newValue){
// Insert additional code to be run only when setting values.}
protected override void OnValidate(Object value){
if (value.GetType() == Type.GetType("Skymail.BusinessObjects.OrderDescriptors.OrderDescriptor")){
}
else if (value.GetType() == Type.GetType("Skymail.BusinessObjects.OrderDescriptors.PostalInfo")){
}
else if (value.GetType() == Type.GetType("Skymail.BusinessObjects.OrderDescriptors.ProductionManifest")){
}
else if (value.GetType() == Type.GetType("Skymail.BusinessObjects.OrderDescriptors.StatusInformation")){
}
else throw new ArgumentException("value must be of type Skymail.BusinessObjects.OrderDescriptors.OrderDescriptor.", "value");}
#endregion
#region
Constructors public OrderDescriptors(){
// // TODO: Add constructor logic here //}
#endregion
}
Lastly here is the class that I am passing in the web service
[
Serializable] public class Order{
#region
Data Members protected int m_OrderID=0; protected string m_CustomerID=null; protected DateTime m_Created; protected string m_Notes=null; protected string m_AirwayBill=null; protected bool m_Deleted=false; protected string m_JobName=null; protected string m_InvoiceID=null; protected string m_CreatedBy="Skymail Employee"; protected string m_StreamName = null; protected int m_OrderType=(int)OrderTypes.Order; protected OrderDescriptors.OrderDescriptors m_Descriptors = new Skymail.BusinessObjects.OrderDescriptors.OrderDescriptors();#endregion
#region
Properties public int OrderID{
get{return m_OrderID;} set{m_OrderID=value;}}
public string CustomerID{
get{return m_CustomerID;} set{m_CustomerID=value;}}
public DateTime Created{
get{return m_Created;} set { m_Created = value; }}
public string Notes{
get{return m_Notes;} set{m_Notes=value;}}
public string AirwayBill{
get{return m_AirwayBill;} set{m_AirwayBill=value;}}
public string JobName{
get{return m_JobName;} set{m_JobName=value;}}
public string InvoiceID{
get{return m_InvoiceID;} set{m_InvoiceID=value;}}
public string CreatedBy{
get{return m_CreatedBy;} set{m_CreatedBy=value;}}
public string StreamName{
get { return m_StreamName; } set { m_StreamName = value; }}
public bool Deleted{
get { return m_Deleted; } set { m_Deleted = value; }}
public OrderDescriptors.OrderDescriptors Descriptors{
get{
return m_Descriptors;}
set{
m_Descriptors =
value;}
}
}Let me know if you need more. I appreciate your help
Thanks
Kenzie