blob: a684a13904f026442e468ce0a19927a8138da10b [file] [log] [blame]
#if FEATURE_SERIALIZABLE
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
namespace Lucene.Net.Util
{
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
public abstract partial class LuceneTestCase
{
#pragma warning disable SYSLIB0011 // Type or member is obsolete (BinaryFormatter)
/// <summary>
/// Serializes <paramref name="source"/> using <see cref="BinaryFormatter"/>
/// and returns a <see cref="MemoryStream"/> with the result of the serialzation.
/// This method is not meant to scale, it is only for quick serialization verification
/// in tests.
/// </summary>
/// <param name="source">The object to serialize. It must be serializable.</param>
/// <returns>A <see cref="MemoryStream"/> containing the serialized result.</returns>
internal static MemoryStream Serialize(object source)
{
IFormatter formatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
formatter.Serialize(stream, source);
return stream;
}
/// <summary>
/// Deserializes the given <paramref name="stream"/> into an object instance
/// of type <typeparamref name="T"/>.
/// </summary>
/// <typeparam name="T">The type to cast to after serialization.</typeparam>
/// <param name="stream">The stream to deserialize.</param>
/// <returns>A deserialized object instance.</returns>
internal static T Deserialize<T>(Stream stream)
{
IFormatter formatter = new BinaryFormatter();
stream.Position = 0;
return (T)formatter.Deserialize(stream);
}
#pragma warning restore SYSLIB0011 // Type or member is obsolete (BinaryFormatter)
/// <summary>
/// Uses <see cref="BinaryFormatter"/> and a <see cref="MemoryStream"/>
/// to serialize and then deserialize <paramref name="source"/>. If the
/// operation succeeds it means that serialization didn't fail, but extra
/// checks should be made on the members of the object to ensure they survived
/// the trip.
/// </summary>
/// <typeparam name="T">The type of <paramref name="source"/>.</typeparam>
/// <param name="source">An object to clone. It must be serializable.</param>
/// <returns>The deserialized object instance (a copy of <paramref name="source"/>).</returns>
internal static T Clone<T>(T source)
{
return Deserialize<T>(Serialize(source));
}
/// <summary>
/// Does a check to ensure a type can serialize and deserialize.
/// <para/>
/// NOTE: This only checks errors. It does not verify that the members survived
/// intact. To make that check, use <see cref="Clone{T}(T)"/> instead.
/// </summary>
/// <typeparam name="T">The type of <paramref name="source"/>.</typeparam>
/// <param name="source">An object to serialize. It must be serializable.</param>
/// <param name="exception">The output <see cref="SerializationException"/> throw if serialization fails.</param>
/// <returns><c>true</c> if the serialization operation was successful; otherwise <c>false</c>.</returns>
internal static bool TypeCanSerialize<T>(T source, out SerializationException exception)
{
try
{
Clone(source);
}
catch (SerializationException e)
{
exception = e;
return false;
}
exception = null;
return true;
}
}
}
#endif