I want to deep copy of my complex C# object having DataTable as property.It is throwing error as "Table SalesData does not belong to this DataSet."
Here is my C# object:
public class Foo
{
    public VehicleDetails VehicleDetails { get; set; }
    public VehicleCondition VehicleCondition { get; set; }
    public string Zipcode { get; set; }
    public string StateCode { get; set; }
    public DataTable SalesData { get; set; }
    public DataTable OtherDataTable { get; set; }
}
I have used following code to clone object:
  public static T CloneFullObject<T>(T i)
    {
        if (Object.ReferenceEquals(i, null)) return default(T);
        var x = new XmlSerializer(i.GetType());
        using (var m = new MemoryStream())
        {
            x.Serialize(m, i);
            m.Seek(0, SeekOrigin.Begin);
            return (T)x.Deserialize(m);
        }
    }
I am creating object as:
   Foo foo = new Foo();
   VehicleDetails vehicleDetail = new VehicleDetails();
   // Fill vehicleDetail object
    VehicleCondition vehicleCondition = new VehicleCondition ();
   // Fill vehicleCondition object
   foo.VehicleDetails = vehicleDetail;
   foo.VehicleCondition = vehicleCondition;
   DataTable salesData = getDataTable();
   salesData.TableName = "salesData";
   foo.SalesData = salesData;
   DataTable otherData = getDataTable();
   salesData.TableName = "otherData";
   foo.OtherDataTable = salesData;
Below code is throwing error as:
       System.InvalidOperationException: There was an error generating the XML document. ---> System.ArgumentException: Table salesData does not belong to this DataSet.
Foo clonefullObject = CloneFullObject(foo);
Please help if I am missing something before cloning object.
Note: both Datatable have value and it's not null.
Edit: class Foo have some complex properties like:
    private int _mileage;
    public void SetMileage(int mileage) { _mileage = mileage; }
    private int _expectedMileage;
    public void SetExpectedMileage(int mileage) { _expectedMileage =       mileage; }
    public int GetMileage(bool flag)
    {
        return (flag)
                   ? _mileage
                   : Math.Max(_mileage, _expectedMileage);
    }
 
     
    