Serialización en VB.NET

Hoy he tenido un problema al intentar duplicar un vector que contenía objetos de clase.
Hiciera lo que hiciera, todas las llamadas a parametros o intentos de crear un duplicado de un elemento de un vector, de tipo clase, me encontraba el mismo problema. Me devolvía siempre un objeto por referencia y nunca por valor.

Esto me estaba dando muchos problemas, por ejemplo, si quería crear un duplicado de un único elemento, por ejemplo extraer un equipo del vector de equipos, y que fuese independiente, no me dejaba, ya que al pasarse por referencia, todos los cambios que yo hacía en el duplicado que había extraido, se estaban cambiando automáticamente en el equipo original en el vector. Lo cual era un desastre.

De modo que la forma que he encontrado, es crear un documento serializandolo, descomponiendolo en pedazos de forma automática en memoria para disponer de dicho duplicado real, y no como hasta ahora, un simple punto de referencia en memoria.

Todas las clases que se deseen serializar, deben incluir esta sentencia delante de la declaración de la clase:

<Serializable()>
 Public Class clsEquipos

También hace falta en los Structures.
Se puede crear una función que realice el trabajo de serialización.


Imports System
 Imports System.Collections.Generic
 Imports System.Text
 Imports System.Runtime.Serialization
 Imports System.IO
 Imports System.Runtime.Serialization.Formatters.Binary
 Namespace Utilidades

 '''
''' Realiza una clonación de un objeto de estructura compleja
 '''
Public Class clsCopiador

 Public Shared Function Duplicar(ByVal fuente)

 'Creamos un stream en memoria
 Dim formatter As IFormatter = New BinaryFormatter()
 Dim stream As Stream = New MemoryStream()

 formatter.Serialize(stream, fuente)
 stream.Seek(0, SeekOrigin.Begin)

 'Deserializamos la porción de memoria en el nuevo objeto
 Return formatter.Deserialize(stream)

 End Function
 End Class
 End Namespace

Otras opciones son mediante clones basicos y complejos.

Dejo aqui dos ejemplos, para desarrollar otro día.

Public Function ShallowCopy() As Person
       Return DirectCast(Me.MemberwiseClone(), Person)
    End Function

    Public Function DeepCopy() As Person
       Dim other As Person = DirectCast(Me.MemberwiseClone(), Person)
       other.IdInfo = New IdInfo(Me.IdInfo.IdNumber)
       Return other
    End Function

MemberwiseClone crea un clon superficial, donde solo copia el primer nivel de objetos, el resto queda por referencia. El efecto me parece desastroso.

Para hacerlo en profundidad hay que reenvíar todos los métodos, propiedades, etc, uno por uno, como se ve en DeepCopy, pero para lo que necesitaba yo, que era una copia completa y total y que no me implique tener que estar pendiente de cada mantenimiento en las propiedades, prefiero la serialización.

Nota: Tened cuidado si vais a volcar este tipo de información para hacer salvados a disco, ya que un salvado en 32 bits no lo podreis recuperar bien en uno de 64 bits y viceversa.

Dejo unas referencias para ampliar información:

Memberwise en MSDN
Memberwise en Java
Ejemplo completo en C#
Lección magistral de Guille

20 Grandes medidas para que no te cunda nada el trabajo en casa.

Ahora que está tan de moda dar listados con las claves y soluciones a todos tus problemas, he querido sumarme a esta emergente demanda de How to’s. Voy a daros mis mejores consejos para que arruineis vuestros proyectos personales y seais una catástrofe en términos de rendimiento del teletrabajo. Toda esta información está avalada por mis amplios conocimientos de la materia.

Vamos allá.

1 -Bienvenido al caos. Lo primero que necesitas, son muchas ganas de no hacer nada. Esto requiere un amplio repertorio de excusas que puedas poner de cara a los demás y sobretodo tienes que aprender a autoengañarte. Tener una autoimágen superlativa ayudará a que menosprecies el esfuerzo requerido para las tareas que debes emprender.

2- No utilices pomodoros ni técnicas similares. Deja que las ideas fluyan en el desorden en el tiempo. Lo mejor para que no te cunda, es un brainstorming continuo en el que nunca llegues a arrancar.

3- Dedica todo tu esfuerzo en planificar tus tareas. Esto hay que hacerlo con ahínco, hasta que el tiempo dedicado a elaborar la lista de tareas, sea al menos, el mismo que el que razonablemente deberías dedicarle al desarrollo de las tareas en sí. Intenta en la medida de lo posible que la primera semana la pierdas totalmente dedicado a elaborar listas con todo lo que tienes que hacer. No pares hasta que la longitud de la lista te aturda y te agobie. Repite el proceso el día con mas tiempo libre de cada semana.

4-Hay que empezar siempre bien el día. Una buena hora es levantarse muy tarde, en torno a las 12:30 del mediodia. Debe ser una hora lo suficientemente tarde, como para que en menos de dos horas vayas a ir a comer. De esta manera, conseguirás, perder las dos horas recien levantado en que no te enteras de nada, y las empalmas con las de la hora de comer. Por supuesto despues de comer, no te va a cundir, así que quedate un rato haciendo la digestión, viendo la tele o jugando a la consola. Algo que te permita evadirte sin problemas de la tremenda lista de trabajo que tienes en tu mesa.

5-Superada esta fase, serán las 5 o 6 de la tarde y te habrás sentado en tu mesa de estudio ordenador. Aquí debes pedir algo de ayuda externa. Pidele a tu pareja, suegra, familia, que entren a interrumpirte en periodos no superiores a 10 minutos.

6- Si lo anterior no es suficiente, adopta un perrito, de aproximadamente 6 Kgs, ya que son los que mas necesidades urinarias tienen. Sacalos a la calle cada vez que se te acerquen. No valen usar como mascotas iguanas, ni similares, ya que no dan practicamente ningún trabajo.

7-Ya habrás alcanzado casi tu objetivo diario, y serán las 8 de la tarde. En este momento, tu sentimiento de culpabilidad debe estar en pleno apogeo. Ya casi has perdido el dia. No lo estropees con un esfuerzo de ultima hora. Lo único que vas a conseguir es animarte lo suficiente como para que al día siguiente te apetezca madrugar. Debes evitar la automotivación en cualquiera de sus vertientes.

8- Si aun asi, te están cundiendo al menos dos horas al día, debes esforzarte mas y aplicar un nuevo paquete de medidas. Soluciones drásticas. Debes impregnar en tu personalidad el dificil arte de la procrastinación, es decir, deja para mañana todo lo que puedas hacer hoy. ¿Por qué estresarse? Practica esto a diario hasta que ya casi no quede tiempo para la entrega.

9- Debes mejorar tu inicio de día. Lo primero que debes hacer, es revisar tus cuentas de correo, y todas tus redes sociales. Juega un rato a trollear a la competencia usando multinicks, con suerte te responderán y tendrás un buen motivo para iniciar una disputa por los foros. Si por un casual no hay feedback, critica alguna falta de puntuación o de ortografía. Tira de wikipedia y del DRAE hasta que acabes discutiendo sobre el holocausto judío.

10-Debes elegir adecuadamente la música que acompañe tu sesión de estudio o trabajo. Es recomendable música estridente y con cantante. La música sin voz, no distrae tanto. La letra siempre produce mejores resultados a la hora de evadirse de lo que estas haciendo. Despues de comer, se recomienda mas música clásica, chillout o newage. No uses música épica, ya que puede provocar un efecto motivador. Sobretodo debes estar cambiando constantemente de canciones y eligiendo las que mejor se adapten.

11-La postura. Es importante, estar reclinado de lado, y con el culo lo mas afuera de la silla. Preferiblemente en sillas no regulables. La mesa de trabajo debe estar bastante elevada y la silla debe ser sin apoyabrazos. Cuanto mas torcidas estén las muñecas, mejor. Ten cerca un sofá. A no mas de un metro de distancia.

12- Si por desgracia está cundiendote y se va acabando el día. No cometas el error de rematar lo que estés haciendo. Dejalo a falta de 10 minutos de trabajo. Acabar el día con un módulo terminado es motivador para empezar el nuevo día con uno nuevo. Evitalo. Enfanga un poco lo que ya tenías terminado y empieza a añadirle algo nuevo pero que impida que lo hecho durante el día, se útil de forma independiente. Por supuesto, no dejes planificado lo que tienes que hacer para el siguiente día. Cuanto mas rato estes por la mañana en el limbo, mejor. Así se consigue que la sensación de agobio y desorden, la tengas desde primera hora y te arrastre todo el día.

13- Intenta dejar todas las tareas de la casa y los recados para otro día. Sobretodo los temas burocráticos ineludibles. Intenta que coincidan con las fechas de entrega o exámen. Es importante no agrupar las tareas. Es decir, si tienes que salir a la calle a hacer tres recados, intenta que estén lo mas alejados posibles los unos de los otros. Si tienes que hacer llamadas de teléfono, no dediques el mismo periodo del día a hacerlas todas juntas. Ve esparciendolas durante el dia. Igual si debes responder correos. Haz uno cada par de horas. Ya sabes no agrupes tareas por tipo de tarea. Si tienes una lista, siguela en el orden en que la creaste, o mejor aun, segun lo que te vaya apeteciendo hacer. Deja lo mas dificil y pesado para el final cuando ya no te quede glucosa en el cerebro.

14- Interacción. Comparte tus avances. Si tienes compañeros en estas tareas, intenta comunicarte con ellos a todas horas. Mandar kilos de whatsapps es una gran opción, porque no solo pierdes tu tiempo sino que además consigues hacerselo perder a tus compañeros. Es un dos en uno. Intenta no incluir contenido laboral o académico en dichos whatsapps, y no te salgas de la regla FPR (Fútbol, Política o Religión). En su defecto también se puede criticar al compañero que no esté presente en esa conversación. Todo en aras de crear un mal clima, que favorece la destrucción de objetivos desde la raiz.

15-Planificaciones a largo plazo. Piensa que debes plantearte los objetivos medidos en periodos largos de tiempo. El motivo es simple. Si tienes el exámen o entrega dentro de tres días, suena mucho mejor, y te da sensación de tener mucho tiempo por delante aun. Si lo cuentas en horas reales efectivas de trabajo (tiempo de oro), quizás solo te salgan 10 o 12 horas, que es mucho menos. Así que ya sabes, cuenta a lo largo. Si tu proyecto tiene de plazo mas de seis meses, con que empieces el último ya vale.

16- Bueno, se que dije que serían 20 puntos, pero entre unas cosas y otras no me ha dado tiempo, así que lo corto por aqui y espero que haya podido ayudaros a ser un poco más inutiles.

vago

Como eliminar las direcciones emergentes al enviar un correo

Si alguna vez has enviado un correo a una dirección errónea, verás que la próxima vez que intentes enviar un correo que empiece con esa misma dirección, Outlook te lo mostrará en sugerencias. Si además eres de los que escribe rápido, probablemente vuelvas a enviar el correo a ese remitente. O si trabajas con buzones departamentales, probablemente pongas la que no es, en el campo De:

Para evitar este problema puedes eliminar las direcciones sugeridas pulsando el botón Supr encima de la dirección. Sencillo, pero muy útil.

Como cargar y guardar archivos RichText con WPF y VB

Es bastante sencillo.

Puedes crear un formulario por ejemplo que tenga un RichTextBox y dos botones, btnCarga y btnGuarda. Añades además un control RichTextBox.

Este control, maravilloso, contiene dos métodos Save y Load, que permitirán volcar o cargar el contenido del RichTextBox en formato Stream.

Pero para acceder al disco utilizaremos un objeto StreamReader o StreamWriter, que en principio no nos cuadrará con el objeto Stream del RichTextBox.

El método por ejemplo para el salvado, es RichTextBox1.Save (objetoStream, dataFormat) y no podemos asignarle directamente un objeto del tipo StreamWriter, pero si, el objeto que contiene el Stream de base que está contenido en el StreamWriter y StreamReader, que es el que realmente necesita, de modo, que pasándole este último funcionará.

Private Sub btnCarga(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click

Dim archivoCarga As New StreamReader("prueba.rtf")
 With RichTextBox1
 .Selection.Select(.Document.ContentStart, RichTextBox1.Document.ContentEnd)
 .Selection.Load(archivoCarga.BaseStream, System.Windows.DataFormats.Rtf)
 End With

End Sub

Private Sub btnGuarda(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button2.Click

Dim archivoSalida As New StreamWriter("prueba.rtf")
 Dim bs As Stream = archivoSalida.BaseStream
 With RichTextBox1
 .Selection.Select(RichTextBox1.Document.ContentStart, RichTextBox1.Document.ContentEnd)
 .Selection.Save(bs, System.Windows.DataFormats.Rtf)
 End With

End Sub

Los métodos Load y Save están en el objeto Selection, de modo que para guardar todo el contenido, forzamos a seleccionarlo todo previamente, o si no, solo guardaría lo seleccionado por el usuario.

Esto requiere además,  controles de comprobación de fichero, los try catch correspondientes para detectar errores, etc, cierre de ficheros, etc, pero para empezar es suficiente.