public static XKey Deserialize( Stream source )
		{
			if( source == null )
			{
				throw new ArgumentNullException( "source" );
			}

			Contract.Ensures( Contract.Result<XKey>() != null );

			var builder = XKey.Empty.ToBuilder();

			using( var reader = new KeyValuePairReader( source, true ) )
			{
				while( true )
				{
					var pair = reader.Read();

					if( pair.Key == null )
					{
						break;
					}

					builder.AddKey( pair.Key, pair.Value );
				}
			}

			return builder.ToImmutable();
		}
		public static XKey Deserialize( string source )
		{
			if( string.IsNullOrEmpty( source ) )
			{
				throw new ArgumentNullException( "source" );
			}

			Contract.Ensures( Contract.Result<XKey>() != null );

			using( var stream = new MemoryStream( Convert.FromBase64String( source ), false ) )
			{
				var builder = XKey.Empty.ToBuilder();

				using( var reader = new KeyValuePairReader( stream ) )
				{
					while( true )
					{
						var pair = reader.Read();

						if( pair.Key == null )
						{
							break;
						}

						builder.AddKey( pair.Key, pair.Value );
					}
				}

				return builder.ToImmutable();
			}
		}