Página 1 de 3

AYUDA: XmlSerializer bastante lento. VB/C#

Publicado: Sab Abr 22, 2017 8:21 pm
por MartinSosa
Bueno amigos, les comento mi situacion, estoy desarrollando un software para la facturacion v3.3 en MVC de ASP.NET y tuve problemas para compilar la clase cfdv33.cs desde el archivo cfdv.xsd y vine a encontrar la solucion nada mas y nada menos que en este foro, ahora me ecuentro en un nuevo problema y no he encontrado informacion al respecto por ningun lado a excepcion de otra persona que tiene el mismo problema pero en VB, escribo este nuevo tema con la esperanza de que puedan ayudarme, les explico:

Una vez que lleno el objeto del tipo Comprobante, al momento de inicializar una nueva instancia del XmlSerializer tarda 5 minutos! y posteriormente al momento de serializar el objeto Comprobante en un archivo XML tarda 2 minutos! y esto de verdad es bastante tiempo, espero y puedan ayudarme de verdad lo agradeceria mucho. Anexo mi codigo:

Código: Seleccionar todo

Comprobante objCompXSD = new Comprobante();

// Nodo comprobante
objCompXSD.Version = "3.3";
objCompXSD.Serie = "MAQ";
objCompXSD.Folio ="1";
objCompXSD.Fecha = Convert.ToDateTime(DateTime.Now.ToString("s"));
objCompXSD.FormaPago = c_FormaPago.Item01;
objCompXSD.SubTotal = Convert.ToDecimal("1000");
objCompXSD.Moneda = c_Moneda.MXN;
objCompXSD.Total = Convert.ToDecimal("1160");
objCompXSD.TipoDeComprobante = c_TipoDeComprobante.I;
objCompXSD.MetodoPago = c_MetodoPago.PUE;
objCompXSD.LugarExpedicion = c_CodigoPostal.Item84000;

// Nodo emisor
objCompXSD.Emisor = new ComprobanteEmisor();
objCompXSD.Emisor.Rfc = "AAA010101AAA";
objCompXSD.Emisor.Nombre = "EMPRESA, S.A.DE C.V.";
objCompXSD.Emisor.RegimenFiscal = c_RegimenFiscal.Item601;

// Nodo receptor
objCompXSD.Receptor = new ComprobanteReceptor();
objCompXSD.Receptor.Rfc = "AAA012101AAA";
objCompXSD.Receptor.Nombre = "NOMBRE";
objCompXSD.Receptor.UsoCFDI = c_UsoCFDI.G01;

// Nodo conceptops
objCompXSD.Conceptos = new ComprobanteConcepto[1]; // Numero de Filas
objCompXSD.Conceptos[0] = new ComprobanteConcepto(); // Instancia de la Fila
objCompXSD.Conceptos[0].ClaveProdServ = c_ClaveProdServ.Item43231500;
objCompXSD.Conceptos[0].Cantidad = 1;
objCompXSD.Conceptos[0].ClaveUnidad = c_ClaveUnidad.C62;
objCompXSD.Conceptos[0].Unidad = "Software";
objCompXSD.Conceptos[0].Descripcion = "Programacion de software";
objCompXSD.Conceptos[0].ValorUnitario = 1;
// [0] Debe aumentar para el siguiente Concepto
                
// Impuestos
objCompXSD.Impuestos = new ComprobanteImpuestos();
objCompXSD.Impuestos.TotalImpuestosTrasladadosSpecified = true; // Estatus si aparece
objCompXSD.Impuestos.TotalImpuestosTrasladados = 222;

// Impuestos Traslados
objCompXSD.Impuestos.Traslados = new ComprobanteImpuestosTraslado[1];
objCompXSD.Impuestos.Traslados[0] = new ComprobanteImpuestosTraslado();
objCompXSD.Impuestos.Traslados[0].Importe = 160;
objCompXSD.Impuestos.Traslados[0].TasaOCuota = c_TasaOCuota.Item0059100;
objCompXSD.Impuestos.Traslados[0].Impuesto = c_Impuesto.Item002;
// Complemento
// objCompXSD.Complemento = new ComprobanteComplemento();

// Creas los namespaces requeridos
XmlSerializerNamespaces xmlNameSpace = new XmlSerializerNamespaces();
xmlNameSpace.Add("cfdi", "http://www.sat.gob.mx/cfd/3");
xmlNameSpace.Add("tfd", "http://www.sat.gob.mx/TimbreFiscalDigital");
xmlNameSpace.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
xmlNameSpace.Add("schemaLocation", "cfdv33.xsd");

// Creas una instancia de XMLSerializer con el tipo de dato Comprobante
XmlSerializer xmlSerialize = new XmlSerializer(typeof(Comprobante));//   <---- AQUI TARDA 5 MINUTOS

// Creas una instancia de XmlTextWriter donde se va a guardar el resultado de la serialización
XmlTextWriter xmlTextWriter = new XmlTextWriter(@"C:\xml\comprobanteSinTimbrar.xml", Encoding.UTF8);
xmlTextWriter.Formatting = Formatting.Indented;

// Y serializas…
xmlSerialize.Serialize(xmlTextWriter, objCompXSD);//   <----- Y AQUI TARDA 2 MINUTOS

xmlTextWriter.Close();
MessageBox.Show("Listo!");

Re: AYUDA: XmlSerializer bastante lento. VB/C#

Publicado: Dom Abr 23, 2017 1:26 am
por Dado
Yo no se programar en VB/C# pero creo saber porque tarda tanto

De casualidad estas haciendo la serializacion basandose en los archivos publicados por el SAT de forma que los archivos son cargador en linea, es decir, accesas a los archivos mediante http://xxxx.xsd ?

Estoy casi seguro que si y lo que debes hacer es descargar esos archivos y hacer que los accese de forma local y no por el protocolo http:

Re: AYUDA: XmlSerializer bastante lento. VB/C#

Publicado: Lun Abr 24, 2017 9:31 am
por MartinSosa
DADO escribió:Yo no se programar en VB/C# pero creo saber porque tarda tanto

De casualidad estas haciendo la serializacion basandose en los archivos publicados por el SAT de forma que los archivos son cargador en linea, es decir, accesas a los archivos mediante http://xxxx.xsd ?

Estoy casi seguro que si y lo que debes hacer es descargar esos archivos y hacer que los accese de forma local y no por el protocolo http:
Que tal, buen dia, en efecto tengo los archivos locales y aun asi sigue tardando...

Re: AYUDA: XmlSerializer bastante lento. VB/C#

Publicado: Lun Abr 24, 2017 12:43 pm
por s3cr3to
Comprueba que realmente no estas haciendo referencia a los archivos por Internet.
Por ejemplo, si tienes bien estructurado tu código:
1) Quita el acceso a Internet de tu Pc donde estas desarrollando
2) Corre tu aplicación:
2.a) si logra generar el XML sin uso de Internet, vas bien, (y lo lento quien sabe porque será)
2.b) si continua lento, no estas haciendo uso del Tip que te dio DADO (aquí esta lo lento)

No se que hace tu aplicación pero al menos debe tronar solo cuando intente timbrar (es decir debe necesitar de Internet).

Re: AYUDA: XmlSerializer bastante lento. VB/C#

Publicado: Mar Abr 25, 2017 6:43 pm
por MartinSosa
Bien acabo de hacer la prueba sin conexion a internet y listo, si genera todo el xml en cuestion de milisegundos, ahora solo me queda una duda:
Como es que puedo poner todo local? si ya tengo descargados y en la misma carpeta todos los archivos, e visto que los namespaces si los saca de un http pero si se lo quito me marca errores, como deberia declarar esos namespaces?
Aqui el codigo de cfdv33.xsd:

Código: Seleccionar todo

<xs:schema xmlns:cfdi="3" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:catCFDI="http://www.sat.gob.mx/sitio_internet/cfd/catalogos" xmlns:tdCFDI="http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI" targetNamespace="http://www.sat.gob.mx/cfd/3" elementFormDefault="qualified" attributeFormDefault="unqualified">
  <xs:import namespace="http://www.sat.gob.mx/sitio_internet/cfd/catalogos" schemaLocation="catCFDI.xsd"/>
  <xs:import namespace="http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI" schemaLocation="tdCFDI.xsd"/>

Re: AYUDA: XmlSerializer bastante lento. VB/C#

Publicado: Mar Abr 25, 2017 6:58 pm
por Dado
Puedo decir............"te lo dijimos" je je je
(la idea de s3cr3to fue muy buena para tener, sin lugar a dudas, la certeza que estabas accesando archivos por http:)

Poner todo local es muy facil, por ejemplo la siguiente linea :

Código: Seleccionar todo

<xs:import namespace="http://www.sat.gob.mx/sitio_internet/cfd/catalogos" schemaLocation="catCFDI.xsd"/>
cambiala a :

Código: Seleccionar todo

<xs:import namespace="c:\mi ruta\esquemas" schemaLocation="catCFDI.xsd"/>
y por supuesto en c:\mi ruta\esquemas debes descargar y grabar el archivo catCFDI.xsd

Re: AYUDA: XmlSerializer bastante lento. VB/C#

Publicado: Mar Abr 25, 2017 7:27 pm
por MartinSosa
Gracias por tu respuesta, los http de esta linea:

Código: Seleccionar todo

<xs:schema xmlns:cfdi="3" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:catCFDI="http://www.sat.gob.mx/sitio_internet/cfd/catalogos" xmlns:tdCFDI="http://www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI" targetNamespace="http://www.sat.gob.mx/cfd/3" elementFormDefault="qualified" attributeFormDefault="unqualified">
los dejo tal cual?

y otra duda, mis archivos los tengo en la raiz del disco "D:" lo estoy poniendo de esta manera y de todos modos me marca error:

Código: Seleccionar todo

<xs:import namespace="D:\" schemaLocation="catCFDI.xsd"/>
<xs:import namespace="D:\" schemaLocation="tdCFDI.xsd"/>

Re: AYUDA: XmlSerializer bastante lento. VB/C#

Publicado: Mar Abr 25, 2017 7:51 pm
por Dado
Si, los que empiecen con xmlns dejalos tal cual

Sabes, creo que si estoy mal, deberia ser asi :

Código: Seleccionar todo

<xs:import namespace="http://www.sat.gob.mx/sitio_internet/cfd/catalogos" schemaLocation="D:\catCFDI.xsd"/>
Es decir, hay que respetar los namespace, pero solo cambiar los schemalocation

(Una disculpa por no darte 100% la respuesta a la primera, como te decia yo no programo en VB/C# pero trato de ayudar en lo que creo que puede ser la solucion)

Re: AYUDA: XmlSerializer bastante lento. VB/C#

Publicado: Mar Abr 25, 2017 8:46 pm
por MartinSosa
Ahora tarda mucho mas amigo, ya estoy desesperado x_x

Re: AYUDA: XmlSerializer bastante lento. VB/C#

Publicado: Mar Abr 25, 2017 10:44 pm
por Dado
OK, esta es mi teoria, igual estoy mal, pero depende de ti confirmarla :

Al inicio, cuando apenas publicaste tu problema, tu sistema estaba descargando de internet y procesando esos pesados catalogos, me refiero a los import catCFDI.xsd y tdCFDI.xsd ......... y tardaba mucho en procesar

Cuando desconectaste internet tu sistema ya NO pudo acceder a esos dos catalogos y en milisegundos pudiste crear el XML

Ahora, cuando cambiaste el schemalocation a local volvio a tardar muchisimo, si funciono el cambio que hiciste y tu sistema ahora si pudo encontrar de forma local esos xsd ........ pero volvio a tardar muchisimo en procesar

Mi conclusion es que los que te estan creando una laguna de tiempo de proceso son los catalogos mencionados

Asi que intenta BORRAR O POR LO MENOS RENOMBRAR los catCFDI.xsd y tdCFDI.xsd y haz pruebas, estoy casi seguro que eliminando la referencia a esos dos puedes volver a procesar de volada.

MIRA, por lo menos ya tienes un momento en el que si proceso en milisegundos, a partir de ahi trata de analizar que es lo que cambia que vuelve a tardar mucho