Tengo un problema único. Estoy registrando un dll como un ensamblado dentro de una base de datos de SQL Server que toma una variable SQLXml, junto con dos cadenas, y serializa los datos en formato JSON.Deserialización de XML en JSON sin utilizar la función XmlDocument.Loadxml()
Para referencia, aquí es la llamada al método:
[SqlProcedure]
public static void Receipt(SqlString initiatorPassword,
SqlString initiatorId,
SqlXml XMLOut,
out SqlString strMessge)
usaría Newtonsoft.Json o Jayrock para esta aplicación si se trataba de cualquier otro tipo de aplicación. Normalmente yo sigo la respuesta dada here y hacer algo similar a:
XmlReader r = (XmlReader)XmlOut.CreateReader();
XmlDocument doc = new XmlDocument();
doc.load(r);
Sin embargo, desde que estoy usando SQLCLR, hay ciertas reglas de la carretera. Una de ellas es que .Load()
y cualquier otro método heredado no se puede utilizar. Creo que el .Net Framework lo dijo mejor:
System.InvalidOperationException: No se puede cargar el ensamblaje de serialización generado dinámicamente. En algunos entornos de alojamiento la funcionalidad de carga del ensamblaje está restringida, considere usar un serializador pregenerado. Por favor vea la excepción interna para más información. ---> System.IO.FileLoadException:
LoadFrom(), LoadFile(), Load (byte []) y LoadModule() han sido deshabilitados por el host.
No soy fluido en SQLCLR por cualquier medio, pero si yo soy la inteligencia this blog correctamente, esto es causado por las reglas de SQLCLR no permitir .load() y heredó métodos sin ser firmado para y que tiene un nombre seguro. Mi DLL y los DLL de terceros que estoy usando no tienen un nombre fuerte ni puedo reconstruirlos y firmarlos yo mismo. Por lo tanto, esto me deja trabado al intentar completar esta tarea sin usar carga (a menos que alguien sepa otra forma en que esto se puede hacer)
Mi única solución que podría surgir es un ciclo muy desagradable que no funciona correctamente , He estado obteniendo una "Jayrock.Json.JsonException: un valor de miembro JSON dentro de un objeto JSON debe estar precedido por su nombre de miembro" excepción. Aquí está el bucle mientras escribía (no es mi mejor código, lo sé):
int lastdepth = -1;
Boolean objend = true;
Boolean wt = false;
//Write Member/Object statements for the header omitted
JsonWriter w = new JsonTextWriter()
while (m.Read())
{
if ((lastdepth == -1) && (m.IsStartElement()))
{//Checking for root element
lastdepth = 0;
}
if ((m.IsStartElement()) && (lastdepth != -1))
{//Checking for Start element (<html>)
w.WriteMember(m.Name);
if (objend)
{ //Check if element is new Parent Node, if so, write start object
w.WriteStartObject();
objend = false;
}
}
if (m.NodeType == XmlNodeType.Text)
{ //Writes text here. NOTE: m.Depth > lastdepth here!!!!!!!
w.WriteString(m.Value);
wt = true;
}
if (m.NodeType == XmlNodeType.Whitespace) //If whitespace, keep on truckin
{ m.Skip(); }
if ((m.NodeType == XmlNodeType.EndElement) && (wt == false) && (lastdepth > m.Depth))
{//End element that ends a series of "Child" nodes
w.WriteEndObject();
objend = true;
}
if ((m.NodeType == XmlNodeType.EndElement) && (wt == true))//Standard end of an el
{ wt = false; }
lastdepth = m.Depth;
}
w.WriteEndObject();
jout = w.ToString();
}
Mi pregunta es, ya que no puedo usar .load()
y mi bucle while es un desastre de depurar, lo que sería la mejor acercarse aquí? El otro enfoque comúnmente discutido es la deserialización en un objeto con variables coincidentes, pero tengo un XML bastante grande que sale de SQL Server. Mi ciclo es un intento de programación dinámica ya que hay ~ 200 campos que se están extrayendo para hacer este XML.
Nota: Estoy usando Jayrock y estoy trabajando en .Net Framework 2.0. No puedo cambiar la versión del marco en este momento.
AFAIK 'XmlDocument.LoadXml()' no necesita dirigir ensamblados dinámicos. ¿Estás seguro de que no estás tratando de usar la serialización XML en su lugar? ¿Podría publicar el rastro de la pila de la excepción? – svick